Delphi 将带逗号的字符串转换为浮点

Delphi 将带逗号的字符串转换为浮点,delphi,regional,Delphi,Regional,是否有一个内置的Delphi函数可以将诸如“3232.00”之类的字符串转换为float?StrToFloat因逗号而引发异常。还是先去掉逗号,然后执行StrToFloat的唯一方法 谢谢。试试:strotfloat(StringReplace('3232.00',',','','') 在进行转换之前,它应该去掉逗号 在C#/VB.NET中,我使用的是类似于decimal.convert(“3232.00”、“,”、”); 我知道如果不去掉多余的字符,就无法进行转换。事实上,我的库中有一个特殊的

是否有一个内置的Delphi函数可以将诸如“3232.00”之类的字符串转换为float?StrToFloat因逗号而引发异常。还是先去掉逗号,然后执行StrToFloat的唯一方法

谢谢。

试试:
strotfloat(StringReplace('3232.00',',','','')
在进行转换之前,它应该去掉逗号

在C#/VB.NET中,我使用的是类似于
decimal.convert(“3232.00”、“,”、”);


我知道如果不去掉多余的字符,就无法进行转换。事实上,我的库中有一个特殊的函数,可以去掉逗号和货币符号。因此,实际上调用
MyConverer.decimalConverter($3232.00));

下面是我使用的。可能有更有效的方法,但这对我来说很有效。简言之,不,我不知道有任何内置的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;

当我的用户需要输入诸如“1234.06mV”之类的“科学”值时,我也遇到了同样的问题。这里有一个逗号、一个乘数(m=x0.001)和一个单位(V)。我创建了一个“宽”格式转换器例程来处理这些情况。
Brian你知道吗,“.”是十进制分隔符,“.”是千位分隔符(总是)? 如果是这样,那么您应该填写tformatsetings记录并将其传递给StrToFloat

FillChar(FS, SizeOf(FS), 0);
... // filling other fields
FS.ThousandSeparator := ',';
FS.DecimalSeparator := '.';
V := StrToFloat(S, FS);

我使用的函数能够将“,”和“.”处理为小数分隔符…:

function ConvertToFloat(aNr: String; aDefault:Integer): Extended;
var
  sNr, s3R, sWhole, sCent:String;
  eRC:Extended;
begin
  sNr:=ReplaceStr(sNr, ' ', '');

  if (Pos('.', sNr) > 0) or (Pos(',', sNr) > 0) then
  begin
    // Get 3rd character from right
    s3R:=LeftStr(RightStr(sNr, 3), 1);
    if s3R <> DecimalSeparator then
    begin
      if not IsNumber(s3R) then
      begin
        s3R := DecimalSeparator;
        sWhole := LeftSr(sNr, Length(sNr) - 3);
        sCent := (RightStr(sNr, 2);
        sNr := sWhole + DecimalSeparator + sCent;
      end
      else
        // there are no decimals... add ',00'
        sNr:=sNr + DecimalSeparator + '00';
    end;
    // DecimalSeparator is present; get rid of other symbols
    if (DecimalSeparator = '.') and (Pos(',', sNr) > 0) then sNr:=ReplaceStr(sNr, ',', '');
    if (DecimalSeparator = ',') and (Pos('.', sNr) > 0) then sNr:=ReplaceStr(sNr, '.', '');
  end;

  eRc := StrToFloat(sNr);
end;
函数ConvertToFloat(aNr:String;aDefault:Integer):扩展;
变量
sNr、s3R、SWHORE、气味:字符串;
eRC:扩展;
开始
信噪比:=ReplaceStr(信噪比,,“”);
如果(位置('',信噪比)>0)或(位置('',信噪比)>0),则
开始
//从右侧获取第三个字符
s3R:=LeftStr(RightStr(sNr,3),1);
如果是s3R小数分隔符,则
开始
如果不是IsNumber(s3R),则
开始
s3R:=小数分隔符;
sWhole:=LeftSr(信噪比,长度(信噪比)-3);
气味:=(右str(信噪比,2);
信噪比:=sWhole+小数点分隔符+气味;
结束
其他的
//没有小数…加上',00'
信噪比:=信噪比+小数点分隔符+'00';
结束;
//小数分隔符存在;请删除其他符号
如果(小数分隔符='。)和(位置(',',信噪比)>0,则信噪比:=ReplaceStr(信噪比,',','');
如果(小数分隔符=',')和(位置(',,信噪比)>0,则信噪比:=ReplaceStr(信噪比,',');
结束;
eRc:=StrToFloat(信噪比);
结束;
Myfunction:

function StrIsFloat2 (S: string;  out Res: Extended): Boolean;
var
  I, PosDecimal: Integer;
  Ch: Char;
  STrunc: string;
  liDots, liComma, J: Byte;
begin
  Result := False;
  if  S = ''
  then  Exit;
  liDots := 0;
  liComma := 0;
  for  I := 1 to Length(S)  do  begin
    Ch := S[I];
    if  Ch = FormatSettings.DecimalSeparator  then  begin
      Inc (liDots);
      if  liDots > 1  then  begin
        Exit;
      end;
    end
    else if  (Ch = '-') and (I > 1) then  begin
      Exit;
    end
    else if Ch = FormatSettings.ThousandSeparator then begin
      Inc (liComma);
    end
    else if not CharIsCipher(Ch) then  begin
      Exit;
    end;
  end;
  if liComma > 0 then begin
    PosDecimal := Pos (FormatSettings.DecimalSeparator, S);
    if PosDecimal = 0 then
      STrunc := S
    else
      STrunc := Copy (S, 1, PosDecimal-1);
    if STrunc[1] = '-' then
      Delete (S, 1, 1);
    if Length(STrunc) < ((liComma * 3) + 2) then
      Exit;
    J := 0;
    for I := Length(STrunc) downto 1 do begin
      Inc(J);
      if J mod 4 = 0 then
        if STrunc[I] <> FormatSettings.ThousandSeparator then
          Exit;
    end;
    S := ReplaceStr (S, FormatSettings.ThousandSeparator, '');
  end;
  try
    Res := StrToFloat (S);
    Result := True;
  except
    Result := False;
  end;
end;
函数StrIsFloat2(S:string;out Res:Extended):布尔;
变量
一、 PosDecimal:整数;
Ch:Char;
STrunc:字符串;
liDots,liComma,J:字节;
开始
结果:=假;
如果S=“”
然后退出;
liDots:=0;
liComma:=0;
对于I:=1到长度(S)不开始
Ch:=S[I];
如果Ch=FormatSettings.DecimalSeparator,则开始
公司(liDots);
如果liDots>1,则开始
出口
结束;
结束
否则,如果(Ch='-')和(I>1),则开始
出口
结束
否则,如果Ch=FormatSettings.000andSeparator,则开始
公司(利科马);
结束
否则,如果不是CharIsCipher(Ch),则开始
出口
结束;
结束;
如果liComma>0,则开始
PosDecimal:=Pos(FormatSettings.DecimalSeparator,S);
如果PosDecimal=0,则
STrunc:=S
其他的
STrunc:=副本(S,1,PosDecimal-1);
如果STrunc[1]='-'则
删除(S,1,1);
如果长度(STrunc)<((liComma*3)+2),则
出口
J:=0;
对于I:=长度(STrunc)向下至1,开始
公司(J);
如果J mod 4=0,则
如果STrunc[I]FormatSettings.ThousandSeparator,则
出口
结束;
S:=ReplaceStr(S,FormatSettings.ThousandSeparator“”);
结束;
尝试
Res:=StrToFloat(S);
结果:=真;
除了
结果:=假;
结束;
结束;
使用Foreach循环

 public static float[] ToFloatArray()
    {
     string pcords="200.812, 551.154, 232.145, 482.318, 272.497, 511.752";

      float[] spiltfloat = new float[pcords.Split(',').Length];
        int i = 0;
        foreach (string s in pcords.Split(','))
        {
           spiltfloat[i] = (float)(Convert.ToDouble(s));
            i++;
        }
        return spiltfloat;
    }

使用lemda表达式将字符串逗号分隔转换为浮点数组

public static float[] ToFloatArrayUsingLemda()
    {
        string pcords="200.812, 551.154, 232.145, 482.318, 272.497, 511.752";
        float[] spiltfloat = new float[pcords.Split(',').Length];

        string[] str = pcords.Split(',').Select(x => x.Trim()).ToArray();

        spiltfloat = Array.ConvertAll(str, float.Parse);
        return spiltfloat;
    }

在使用逗号作为小数点的地区,这项工作是否有任何要求?例如,在欧洲的任何地方?在其他地区也可以这样做:在最后一行中替换“,”并用千分位符替换行。对于其他地区,您也可以用CurrencyString替换美元符号。假设您使用的是Delphi 7 or更高,否则formatsettings参数不可用,StrToFloat很乐意忽略您设置的任何千位分隔符。
FillChar(FS,SizeOf(FS),0);
真的有必要吗?在没有(Delphi XE2)的情况下它似乎也能工作。@user1580348是的,这是必要的。它可以工作,但只有通过coincedense。也就是说:要么填充所有字段(并且在下一个Delphi版本中不会添加新字段),或者StrToFloat不使用FS中的垃圾。由于您对Delphi RTL几乎没有控制权,因此应该将未使用的字段归零。这在XE6上不起作用。StrToFloat的帮助文件特别指出,“字符串中不允许使用千个分隔符和货币符号。”包括格式设置似乎对此没有任何影响。D7中的StrToFloat()不适用于数千个分隔符(逗号、空格、句点(法语)等),不管传入的是什么格式设置。它们需要先去掉(请参阅另一个答案中的StringReplace)。我很惊讶这被标记为解决方案。它在其他版本中是否适用于其他人?StrotFloat()确实使用传入的TFormatSettings十进制分隔符,但这不是问题所在。这不可编译。StringReplace有第四个参数;'Flags'只是将[]放在Flags参数中:StrotFloat(StringReplace('3232.00',',',','','','',[])你似乎忽略了问题中的Delphi标记。你似乎忽略了问题中的Delphi标记。
public static float[] ToFloatArrayUsingLemda()
    {
        string pcords="200.812, 551.154, 232.145, 482.318, 272.497, 511.752";
        float[] spiltfloat = new float[pcords.Split(',').Length];

        string[] str = pcords.Split(',').Select(x => x.Trim()).ToArray();

        spiltfloat = Array.ConvertAll(str, float.Parse);
        return spiltfloat;
    }