12

「3,232.00」などの文字列を float に変換する組み込みの Delphi 関数はありますか? StrToFloat はコンマが原因で例外を発生させます。または、最初にカンマを取り除いてから StrToFloat を実行する唯一の方法ですか?

ありがとう。

4

10 に答える 10

15

「。」ということを正確に知っていますか?は小数点記号で、「,」は千単位の区切り記号です (常に)? その場合は、TFormatSettings レコードに入力して、StrToFloat に渡す必要があります。

FillChar(FS, SizeOf(FS), 0);
... // filling other fields
FS.ThousandSeparator := ',';
FS.DecimalSeparator := '.';
V := StrToFloat(S, FS);
于 2009-04-25T06:56:36.620 に答える
9

以下は私が使用するものです。もっと効率的な方法があるかもしれませんが、これは私にとってはうまくいきます。要するに、いいえ、カンマを含む文字列浮動小数点数を浮動小数点数に変換する組み込みの 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;
于 2009-04-25T03:26:27.873 に答える
4
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;
于 2009-07-21T20:09:03.543 に答える
4

試してください:StrToFloat(StringReplace('3,232.00', ',', '') 変換を行う前にコンマを取り除く必要があります。

私が使用するC#/ VB.NETでは、次のようなものを使用しますdecimal.convert("3,232.00", ",", "");

余分な文字を削除せずに変換を行う方法はありません。実際、私のライブラリには、コンマと通貨記号を削除する特別な機能があります。だから実際に電話するMyConverer.decimalConverter("$3,232.00");

于 2009-04-25T02:37:47.710 に答える
0

ユーザーが「1,234.06mV」などの「科学的」値を入力する必要がある場合、同じ問題が発生しました。ここにはコンマ、乗数 (m=x0.001)、単位 (V) があります。これらの状況を処理するために、「ワイド」フォーマット コンバーター ルーチンを作成しました。ブライアン

于 2009-04-25T06:06:40.000 に答える