2014-09-13 16 views
6

Cosa sto facendo male qui? Voglio semplicemente convertire una stringa formattata in una doppia e usare TFormatSettings passato come parametro a StrToFloat. Ottengo la seguente eccezione:delphi xe5 Errore di StrToFloat che modifica ThousandSeparator in ","

'3,332.1' is not a valid floating point value. 

Il separatore delle migliaia e separatore decimale sono i valori attesi ('' e '') in TFormatSettings.

procedure TForm2.Button1Click(Sender: TObject); 
var 
    FS: TFormatSettings; 
    S: String; 
    V: double; 
begin 
    FS:= TFormatSettings.Create; 
    codesite.Send('ThousandSeparator', FS.ThousandSeparator); //correct ',' 
    codesite.Send('DecimalSeparator', FS.DecimalSeparator); //correct '.' 
    S := '3,332.1'; 
    try 
    V := StrToFloat(S, FS); 
    except on E: Exception do 
    ShowMessage(e.Message); 
    end; 
    CodeSite.Send('S', S); 
    CodeSite.Send('V', V); 
end; 

risposta

2

Quello che state facendo qui è corretto, ma è inciampato in quello che sembra un bug (se non un bug, almeno un comportamento non molto consistente) del TextToFloat (sembra che ignora ThousandSeparator) funzione interna di unità di Delphi SysUtils (date un'occhiata al Q92265 a seguire risoluzione) ...

come una soluzione si può provare a rimuovere il separatore di gruppo, in questo modo:

StringReplace('3,332.1', ',', '', [rfReplaceAll]) 
+0

grazie! Mi stavo chiedendo se fosse un errore ma avevo difficoltà a credere che sarebbe esistito in una semplice funzione. La mia soluzione è semplicemente rimuovere il separatore delle migliaia e la conversione funziona come previsto. –

+0

Questo è esattamente quello che ho fatto (StringReplace) –

+5

Non è un bug. È di progettazione. La documentazione è abbastanza chiara. –

9

questo comportamento è stato progettato come. Da documentation, con la mia enfasi:

Utilizzare StrToFloat per convertire una stringa, S, in un valore a virgola mobile. S deve consistere in un segno opzionale (+ o -), una stringa di cifre con un punto decimale opzionale e una mantissa opzionale. La mantissa consiste di "E" o "e" seguiti da un segno opzionale (+ o -) e un numero intero. Gli spazi vuoti iniziali e finali vengono ignorati.

La variabile globale DecimalSeparator o il suo equivalente TFormatSettings definisce il carattere utilizzato come punto decimale. Migliaia di separatori e simboli di valuta non sono consentiti nella stringa. Se S non contiene un valore valido, StrToFloat genera un'eccezione EConvertError.

Quindi è un errore passare una stringa contenente un separatore di migliaia a questa funzione.

+0

Perché il FloatToStrF mette il separatore dei Mille? Non è un disegno molto coerente, penso ... – aleroot

+1

Puoi discutere tutto ciò che ti piace del design. Personalmente ritengo che il design sia perfetto. Ma è sbagliato sostenere che è un bug. –

+0

E per quanto riguarda il design, la funzione che corrisponde a StrToFloat è FloatToStr, non è vero? –