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