Newsgroup: it.comp.lang.visual-basic
Titolo: Separatore decimali e impostazioni internazionali

Buongiorno a tutti,
il mio problema è determinato dalla modifica delle impostazioni 
internazionali (separatore dei decimali)
Ho creato un piccolo software (composto da 2 form) per eseguire un 
semplice algoritmo.
   He (mol%) = (a * C1) + b
   If C1 >= X1 And C1 <= X2 Then
     He = (a1 * C1) + b1
   ElseIf C1 > X2 And C1 <= X3 Then
     He = (a2 * C1) + b2
   ElseIf C1 > X3 Then
     He = (a3 * C1) + b3
   Else
     He = 0
   End If
   were:
   C1  =  C1 (mol%) - analysis value
   Xi  =  C1 (mol%) - condition
   ai  =  First member of correlation
   bi  =  Second member of correlation
Al fine di migliorarne l'utilizzo ho creato nel secondo form una 
maschera nella quale inserire le variabili ai, bi e Xi ed al fine di 
memorizzarle su file ho utilizzato la forma:
  Try
             'Conversion Input Values to Double
             Dbl_a1 = CDbl(Txt_a1.Text)
             Dbl_a2 = CDbl(Txt_a2.Text)
             Dbl_a3 = CDbl(Txt_a3.Text)
             Dbl_b1 = CDbl(Txt_b1.Text)
             Dbl_b2 = CDbl(Txt_b2.Text)
             Dbl_b3 = CDbl(Txt_b3.Text)
             Dbl_y1 = CDbl(Txt_y1.Text)
             Dbl_y2 = CDbl(Txt_y2.Text)
             Dbl_y3 = CDbl(Txt_y3.Text)
         Catch ex As Exception
         End Try
         ' Initializes variables to pass to the MessageBox.Show method.
         Dim Message As String = "Do you want to save the new values?"
         Dim Caption As String = "Default Variables"
         Dim Buttons As Integer = MessageBoxButtons.YesNo
         Dim Result As DialogResult
         'Displays a MessageBox using the Question icon and specifying 
the No button as the default.
         Result = MessageBox.Show(Me, Message, Caption, 
MessageBoxButtons.YesNo, MessageBoxIcon.Question, 
MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
         ' Gets the result of the MessageBox display.
         If Result = DialogResult.Yes And IsNumeric(Txt_a1.Text) And 
IsNumeric(Txt_a2.Text) And IsNumeric(Txt_a3.Text) And 
IsNumeric(Txt_b1.Text) And IsNumeric(Txt_b2.Text) And 
IsNumeric(Txt_b3.Text) And IsNumeric(Txt_y1.Text) And 
IsNumeric(Txt_y2.Text) And IsNumeric(Txt_y3.Text) And Dbl_y1 < Dbl_y2 
And Dbl_y2 < Dbl_y3 And Dbl_y3 < 100 Then
             Dim Dat_DefVar As New StreamWriter("Def_Var.txt")
             'Default values Writing into Def_Var.txt file
             Try
                 Dat_DefVar.WriteLine(Dbl_a1)
                 Dat_DefVar.WriteLine(Dbl_b1)
                 Dat_DefVar.WriteLine(Dbl_a2)
                 Dat_DefVar.WriteLine(Dbl_b2)
                 Dat_DefVar.WriteLine(Dbl_a3)
                 Dat_DefVar.WriteLine(Dbl_b3)
                 Dat_DefVar.WriteLine(Dbl_y1)
                 Dat_DefVar.WriteLine(Dbl_y2)
                 Dat_DefVar.WriteLine(Dbl_y3)
             Catch ex As Exception
             End Try
             Dat_DefVar.Close()
         End If
         'Type in Error Management
         'a1 Invalid Value
         If Not IsNumeric(Txt_a1.Text) Then
             ErrorProvider1.SetError(Txt_a1, " ")
             MessageBox.Show("Type in a valid value (Not Null or 
Letters)", "Variable input value", MessageBoxButtons.OK, 
MessageBoxIcon.Exclamation)
             ErrorProvider1.SetError(Txt_a1, "")
             Txt_a1.Clear()
         End If
         'a2 Invalid Value
         If Not IsNumeric(Txt_a2.Text) Then
             ErrorProvider1.SetError(Txt_a2, " ")
             MessageBox.Show("Type in a valid value (Not Null or 
Letters)", "Variable input value", MessageBoxButtons.OK, 
MessageBoxIcon.Exclamation)
             ErrorProvider1.SetError(Txt_a2, "")
             Txt_a2.Clear()
         End If
         'a3 Invalid Value
         If Not IsNumeric(Txt_a3.Text) Then
             ErrorProvider1.SetError(Txt_a3, " ")
             MessageBox.Show("Type in a valid value (Not Null or 
Letters)", "Variable input value", MessageBoxButtons.OK, 
MessageBoxIcon.Exclamation)
             ErrorProvider1.SetError(Txt_a3, "")
             Txt_a3.Clear()
         End If
         'b1 Invalid Value
         If Not IsNumeric(Txt_b1.Text) Then
             ErrorProvider1.SetError(Txt_b1, " ")
             MessageBox.Show("Type in a valid value (Not Null or 
Letters)r", "Variable input value", MessageBoxButtons.OK, 
MessageBoxIcon.Exclamation)
             ErrorProvider1.SetError(Txt_b1, "")
             Txt_b1.Clear()
         End If
         'b2 Invalid Value
         If Not IsNumeric(Txt_b2.Text) Then
             ErrorProvider1.SetError(Txt_b2, " ")
             MessageBox.Show("Type in a valid value (Not Null or 
Letters)", "Variable input value", MessageBoxButtons.OK, 
MessageBoxIcon.Exclamation)
             ErrorProvider1.SetError(Txt_b2, "")
             Txt_b2.Clear()
         End If
         'b3 Invalid Value
         If Not IsNumeric(Txt_b3.Text) Then
             ErrorProvider1.SetError(Txt_b3, " ")
             MessageBox.Show("Type in a valid value (Not Null or 
Letters)", "Variable input value", MessageBoxButtons.OK, 
MessageBoxIcon.Exclamation)
             ErrorProvider1.SetError(Txt_b3, "")
             Txt_b3.Clear()
         End If
         'y1 Invalid Value
         If Not IsNumeric(Txt_y1.Text) Or Dbl_y1 < 0 Then
             ErrorProvider1.SetError(Txt_y1, " ")
             MessageBox.Show("Type in a valid value (Not Null or 
Letters)", "Condition input value", MessageBoxButtons.OK, 
MessageBoxIcon.Exclamation)
             Dbl_C1 = 0
             ErrorProvider1.SetError(Txt_y1, "")
         End If
         'y1 > y2 Type in Error !!!
         If IsNumeric(Txt_y1.Text) And IsNumeric(Txt_y2.Text) And Dbl_y1 
 > Dbl_y2 Then
             ErrorProvider1.SetError(Txt_y1, " ")
             MessageBox.Show("y1 value must be smaller than y2", 
"Condition input value", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
             Txt_y1.Clear()
             Dbl_C1 = 0
             ErrorProvider1.SetError(Txt_y1, "")
         End If
         'y2 Invalid Value
         If Not IsNumeric(Txt_y2.Text) Or Dbl_y2 < 0 Then
             ErrorProvider1.SetError(Txt_y2, " ")
             MessageBox.Show("Type in a positive number", "Condition 
input value", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
             Dbl_C1 = 0
             ErrorProvider1.SetError(Txt_y2, "")
         End If
         'y2 > y3 Type in Error !!!
         If IsNumeric(Txt_y3.Text) And IsNumeric(Txt_y2.Text) And Dbl_y2 
 > Dbl_y3 Then
             ErrorProvider1.SetError(Txt_y2, " ")
             MessageBox.Show("y2 value must be smaller than y3", 
"Condition input value", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
             Txt_y2.Clear()
             Dbl_C1 = 0
             ErrorProvider1.SetError(Txt_y2, "")
         End If
         'y3 Invalid Value
         If Not IsNumeric(Txt_y3.Text) Or Dbl_y3 < 0 Then
             ErrorProvider1.SetError(Txt_y3, " ")
             MessageBox.Show("Type in a positive number", "Condition 
input value", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
             Dbl_C1 = 0
             ErrorProvider1.SetError(Txt_y3, "")
         End If
         'y3 > 100
         If IsNumeric(Txt_y3.Text) And Dbl_y3 > 100 Then
             ErrorProvider1.SetError(Txt_y3, " ")
             MessageBox.Show("y3 must be smaller than 100%", "Condition 
input value", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
             Txt_y3.Clear()
             Dbl_C1 = 0
             ErrorProvider1.SetError(Txt_y3, "")
         End If
         'Focus on a1 TextBox
         Txt_a1.Focus()
Fin tanto che utilizzo le mie impostazioni internazionali (sep. dec. "." 
e sep. mig. ",") tutto funziona in maniera corretta; all'apertura del 
programma i dati presenti nel file vengono letti e presentati nel form 
principale correttamente; se apro il secondo form e leggo i dati di 
default oppure li cambio e poi li salvo, tutto OK.
Il problema sorge nel momento in cui modifico le imp. int. (sep. dec. 
"," e sep. mig. "."); in lettura tutto si incasina.
In lettura utilizzo la seguente forma:
         'Default values Reading from Def_Var.txt file
         Dim Def_a1 As String
         Dim Def_b1 As String
         Dim Def_a2 As String
         Dim Def_b2 As String
         Dim Def_a3 As String
         Dim Def_b3 As String
         Dim Def_y1 As String
         Dim Def_y2 As String
         Dim Def_y3 As String
         Dim Dat_DefVar As New StreamReader("Def_Var.txt")
         Def_a1 = Dat_DefVar.ReadLine()
         Def_b1 = Dat_DefVar.ReadLine()
         Def_a2 = Dat_DefVar.ReadLine()
         Def_b2 = Dat_DefVar.ReadLine()
         Def_a3 = Dat_DefVar.ReadLine()
         Def_b3 = Dat_DefVar.ReadLine()
         Def_y1 = Dat_DefVar.ReadLine()
         Def_y2 = Dat_DefVar.ReadLine()
         Def_y3 = Dat_DefVar.ReadLine()
         Dat_DefVar.Close()
         Dbl_a1 = CDbl(Def_a1)
         Txt_a1.Text = FormatNumber(Dbl_a1, 5)
         Dbl_a2 = CDbl(Def_a2)
         Txt_a2.Text = FormatNumber(Dbl_a2, 5)
         Dbl_a3 = CDbl(Def_a3)
         Txt_a3.Text = FormatNumber(Dbl_a3, 5)
         Dbl_b1 = CDbl(Def_b1)
         Txt_b1.Text = FormatNumber(Dbl_b1, 5)
         Dbl_b2 = CDbl(Def_b2)
         Txt_b2.Text = FormatNumber(Dbl_b2, 5)
         Dbl_b3 = CDbl(Def_b3)
         Txt_b3.Text = FormatNumber(Dbl_b3, 5)
         Dbl_y1 = CDbl(Def_y1)
         Txt_y1.Text = FormatNumber(Dbl_y1, 2)
         Dbl_y2 = CDbl(Def_y2)
         Txt_y2.Text = FormatNumber(Dbl_y2, 2)
         Dbl_y3 = CDbl(Def_y3)
         Txt_y3.Text = FormatNumber(Dbl_y3, 2)
Vorrei sapere qual'è il modo per avere delle impostazioni relative al 
formato dei numeri indipendenti dalla configurazione del pc su cui gira 
il software oppure se il metodo che ho utilizzato è scorretto oppure ... 
Sono aperto a qualsiasi consiglio :-)))
Perdonate la prolissità e la mia scarsa competenza :-|
Grazie in aticipo a tutti, Andrea

 qualsiasi consiglio :-)))
Ovviamente non mi metto neppure a guardare millemila pagine di codice 
cercando di capire cosa hai fatto.
Ti dico solo che devi decidere se vuoi che:
1) l'utente possa scrivere le cose in un determinato formato, e tale 
formato resti sempre quello indipendentemente dalle impostazioni del 
sistema operativo.
2) l'utente possa scrivere le cose nel formato determinato dalle 
impostazioni locali.
Nel caso 1 (che è quello che faccio io, ma è una mia scelta), devi 
usare sempre e solo funzioni delocalizzate. Esse sono Val, Str, 
DateSerial, TimeSerial, e Format$ con alcune attenzioni. Spesso 
occorrerà scrivere parser proprietari.
Nel caso 2 (molto più diffuso), dovrai usare sempre e solo funzioni 
delocalizzate. Esse sono CLong, CDbl, CInt, CStr, CDate, e Format$ se 
usato senza attenzione. Le conversioni implicite sono sempre 
localizzate, e ricadono in questa categoria.
E' fondamentale NON mescolare mai.
Basta che in un applicativo con logica di tipo 1 (secondo la 
numerazione fatta qui sopra) venga usata anche una sola volta una 
funzione appropriata per il tipo 2, perchè tutto diventi a rischio 
boom. Vale anche il viceversa.
Facendo la scelta in modo razionale, e rispettando rigorosamente l'uso 
delle funzioni di conversione, i problemi non si pongono.
Ciao
Alberto
-- 
Autore di
"Petting for Dummies"

Albe V° ha scritto:

Grazie per la risposta (propendo per la prima soluzione che mi hai 
prospettato), anche se ad un profano come me non appare del tutto 
chiara. Ho dimenticato di precisare che utilizzo VB.Net. Grazie ancora; 
a quanto pare ho ancora moooolto da imparare e studiare. Andrea

 prospettato)
Il che fa riflettere, visto che il tuo codice (anche se non l'ho 
sfogliato tutto, ovviamente), è quasi completamente votato alla seconda 
soluzione.
La prima è tassativamente da scegliere se l'input è un file che viene 
letto e che può essere stato scritto in altri momenti o da altri 
sistemi.


Albe V° ha scritto:

Wow. Pare che adesso abbia compreso un mattoncino in più, pura gioia, ti 
ringrazio moltissimo :-)))
Si, adesso mi rendo conto che la scrittura del codice risulta 
contraddittoria, però ...
Grazie ancora e complimenti per lo splendido forum !!!
Andrea
P.S.
Credo che diventerò un assiduo lettore, con la speranza di non 
diventare, per voi, uno scocciatore ;-)

 Andrea
Forum?!?!
Forse intendevi Newsgroup....
Cmq torna pure a trovarci.
Ciao, Vincenzo