「3,232.00」などの文字列を float に変換する組み込みの Delphi 関数はありますか? StrToFloat はコンマが原因で例外を発生させます。または、最初にカンマを取り除いてから StrToFloat を実行する唯一の方法ですか?
ありがとう。
「。」ということを正確に知っていますか?は小数点記号で、「,」は千単位の区切り記号です (常に)? その場合は、TFormatSettings レコードに入力して、StrToFloat に渡す必要があります。
FillChar(FS, SizeOf(FS), 0);
... // filling other fields
FS.ThousandSeparator := ',';
FS.DecimalSeparator := '.';
V := StrToFloat(S, FS);
以下は私が使用するものです。もっと効率的な方法があるかもしれませんが、これは私にとってはうまくいきます。要するに、いいえ、カンマを含む文字列浮動小数点数を浮動小数点数に変換する組み込みの Delphi 関数を知りません
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
safeFloat
Strips many bad characters from a string and returns it as a double.
}
function safeFloat(sStringFloat : AnsiString) : double;
var
dReturn : double;
begin
sStringFloat := stringReplace(sStringFloat, '%', '', [rfIgnoreCase, rfReplaceAll]);
sStringFloat := stringReplace(sStringFloat, '$', '', [rfIgnoreCase, rfReplaceAll]);
sStringFloat := stringReplace(sStringFloat, ' ', '', [rfIgnoreCase, rfReplaceAll]);
sStringFloat := stringReplace(sStringFloat, ',', '', [rfIgnoreCase, rfReplaceAll]);
try
dReturn := strToFloat(sStringFloat);
except
dReturn := 0;
end;
result := dReturn;
end;
function StrToFloat_Universal( pText : string ): Extended;
const
EUROPEAN_ST = ',';
AMERICAN_ST = '.';
var
lformatSettings : TFormatSettings;
lFinalValue : string;
lAmStDecimalPos : integer;
lIndx : Byte;
lIsAmerican : Boolean;
lIsEuropean : Boolean;
begin
lIsAmerican := False;
lIsEuropean := False;
for lIndx := Length( pText ) - 1 downto 0 do
begin
if ( pText[ lIndx ] = AMERICAN_ST ) then
begin
lIsAmerican := True;
pText := StringReplace( pText, ',', '', [ rfIgnoreCase, rfReplaceAll ]); //get rid of thousand incidental separators
Break;
end;
if ( pText[ lIndx ] = EUROPEAN_ST ) then
begin
lIsEuropean := True;
pText := StringReplace( pText, '.', '', [ rfIgnoreCase, rfReplaceAll ]); //get rid of thousand incidental separators
Break;
end;
end;
GetLocaleFormatSettings( LOCALE_SYSTEM_DEFAULT, lformatSettings );
if ( lformatSettings.DecimalSeparator = EUROPEAN_ST ) then
begin
if lIsAmerican then
begin
lFinalValue := StringReplace( pText, '.', ',', [ rfIgnoreCase, rfReplaceAll ] );
end;
end;
if ( lformatSettings.DecimalSeparator = AMERICAN_ST ) then
begin
if lIsEuropean then
begin
lFinalValue := StringReplace( pText, ',', '.', [ rfIgnoreCase, rfReplaceAll ] );
end;
end;
pText := lFinalValue;
Result := StrToFloat( pText, lformatSettings );
end;
試してください:StrToFloat(StringReplace('3,232.00', ',', '')
変換を行う前にコンマを取り除く必要があります。
私が使用するC#/ VB.NETでは、次のようなものを使用しますdecimal.convert("3,232.00", ",", "");
余分な文字を削除せずに変換を行う方法はありません。実際、私のライブラリには、コンマと通貨記号を削除する特別な機能があります。だから実際に電話するMyConverer.decimalConverter("$3,232.00");
ユーザーが「1,234.06mV」などの「科学的」値を入力する必要がある場合、同じ問題が発生しました。ここにはコンマ、乗数 (m=x0.001)、単位 (V) があります。これらの状況を処理するために、「ワイド」フォーマット コンバーター ルーチンを作成しました。ブライアン