VB.NET – Risolvere i problemi dei separatori decimali : punto o virgola ?
Mi capita spesso di sviluppare un’applicazione su una macchina, che magari genera files di testo contenenti numeri decimali e di passarla poi su un’altra macchina che non interpreta correttamente i decimali perchè la cultura è differente e quindi il punto non viene visto come separatore decimale ma come separatore delle migliaia ecc… Immaginate che cosa può succedere. Un bel problema, soprattutto perchè mi capita troppo spesso che in uno stesso ufficio ci sono due pc adiacenti con queste impostazioni differenti, ma gli utilizzatori sono entrambi italiani…. Per ora sto cercando di risolvere in questo modo, soprattutto riguardo all’immissione numerica nelle textbox:
Il separatore decimale utilizzato dal pc in utilizzo è memorizzato in questa proprietà:
System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator |
Per cui, si può fare in modo che un utente (evitando che inserisca il separatore delle migliaia), può sempre digitare il separatore decimale giusto con un piccolo espediente. Definiamo due variabili pubbliche all’inizio del Form:
Public Sep, SepC As Short ' contengono i codici ascii del separatore decimale in uso e di quello da sostituire |
Dopodichè, magari nell’evento Load del form impostiamo queste due variabili:
' Ricavo il separatore decimale del sistema in uso Sep = Asc(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) If Sep = 46 Then ' Separatore corrente: punto SepC = 44 ' carattere da cambiare: virgola ElseIf Sep = 44 Then ' Separatore corrente: virgola SepC = 46 ' carattere da cambiare: punto End If |
Quindi ci sarà una textbox incui vogliamo fare in modo che l’utente digiti sempre il separatore corretto, per cui se il sistema in uso prevede il punto, con un trucco si fa in modo che se viene digitata la virgola, compare comunque il punto:
Private Sub txtValue_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtValue.KeyPress Dim KeyAscii As Short = Asc(e.KeyChar) '... (Qui va il codice per fare in modo che vengano digitati soltanto numeri) ' Sostituisco il separatore decimale errato con quello richiesto dal sistema corrente If KeyAscii = SepC Then KeyAscii = Sep End If e.KeyChar = Chr(KeyAscii) End Sub |
Con questo trucco ho risolto qualche bel problemino. Ovviamente se vogliamo distribuire un’applicazione cosi fatta in paesi in cui utilizzano i punti come separatori delle migliaia… creeremo una bella confusione… Ma io utilizzo questo sistema in Italia dove non siamo abituati a separare le migliaia… Quindi…
Il separatore delle migliaia invece è contenuto nella proprietà NumberGroupSeparator. Tali proprietà sono di sola lettura