文字列値を含む Variant を浮動小数点変数に代入すると、Delphi は VarToDoubleAsString を呼び出して変換を行います。次に、OS の設定を使用して、10 進数と 1000 単位の区切り文字を (VarR8FromStr 経由で) 使用します。SysUtils.DecimalSeparator
とを変更する必要がある場合、これは問題ですSysUtils.ThousandSeparator
。たとえば、次のプログラムを実行します。
program VarStrToFloat;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
function FormatFloatUsingDelphiSettings(Value: Extended): string;
begin
Result := FormatFloat('#,##0.00', Value);
end;
procedure Test(const AMsg: string);
var
r1, r2: Extended;
s1, s2: string;
v: Variant;
begin
r1 := 5432.1;
s1 := FormatFloatUsingDelphiSettings(r1);
v := s1; // <== conversion uses OS settings
r2 := v;
s2 := FormatFloatUsingDelphiSettings(r2);
Write(AMsg: 8, s1: 10, s2: 10, ' ');
if SameValue(r1, r2) then
Writeln('OK')
else
Writeln('FAIL');
end;
procedure SwapEm;
var
tmp: Char;
begin
tmp := DecimalSeparator;
DecimalSeparator := ThousandSeparator;
ThousandSeparator := tmp;
end;
begin
Test('Default');
SwapEm;
Test('Changed');
Readln;
end.
最初のテストは問題なく動作しますが、2 番目のテストは失敗します。
Variant 変換SysUtils.DecimalSeparator
で and を使用する方法はありSysUtils.ThousandSeparator
ますか?