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

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)