2014-09-13 4 views
6

여기서 내가 뭘 잘못하고 있니? 단순히 형식이 지정된 문자열을 double로 변환하고 StrToFloat에 매개 변수로 전달 된 TFormatSettings를 사용하기 만하면됩니다. 나는 다음과 같은 예외가 :delphi xe5 StrToFloat 실패, 천사 분리자가 ','로 변경됨

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

1000 개 단위 구분 및 소수점 구분이 예상되는 값이다 (','및 '.') TFormatSettings한다. (하지 버그가 적어도 매우 일치하지 않는 행동 경우) TextToFloat의 내부 함수 (ThousandSeparator을 무시하는 것 같다)

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; 

답변

2

당신 여기서 뭐하는 올바른지,하지만 당신은 버그를 보이는에서 발견 델파이 SysUtils를 단위의이 방법으로 그룹 분리를 제거하려고 할 수있는 해결 방법으로

(해상도를 따르도록 Q92265를 찾아 보라) :

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

감사합니다. 나는 그것이 버그인지 궁금해했지만 단순한 기능으로 존재할 것이라고 믿기가 어려웠습니다. 내 해결 방법은 단지 천 단위 구분 기호를 제거하고 변환이 예상대로 작동합니다. –

+0

그건 정확히 내가 한 일이야 (StringReplace) –

+5

그건 버그가 아니야. 의도적으로 설계된 것입니다. 문서는 아주 분명합니다. –

9

이 동작이 설계되어있다. documentation에서 내 강조와 함께 :

문자열 S를 부동 소수점 값으로 변환하려면 StrToFloat를 사용하십시오. S는 선택적 기호 (+ 또는 -), 선택적 소수점이있는 숫자 문자열 및 선택적 가수로 구성되어야합니다. 가수는 'E'또는 'e'다음에 선택적 기호 (+ 또는 -)와 정수로 구성됩니다. 선행 공백과 후행 공백은 무시됩니다.

DecimalSeparator 전역 변수 또는 해당 TFormatSettings 동등한 문자는 소수점으로 사용되는 문자를 정의합니다. 문자열에는 1,000 개의 분리 기호 및 통화 기호를 사용할 수 없습니다. S가 유효한 값을 포함하지 않으면 StrToFloat는 EConvertError 예외를 발생시킵니다.

따라서 천 단위 구분 기호가 포함 된 문자열을이 함수에 전달하는 것은 실수입니다.

+0

FloatToStrF가 천 단위 구분 기호를 넣는 이유는 무엇입니까? 매우 일관된 디자인은 아닙니다. 제 생각에 ... – aleroot

+1

디자인에 대해 좋아하는 모든 것을 주장 할 수 있습니다. 개인적으로 디자인이 괜찮다고 생각합니다. 그러나 그것이 버그라고 주장하는 것은 잘못입니다. –

+0

그리고 디자인에 관해서는 StrToFloat와 일치하는 함수는 FloatToStr이 아닙니까? –