Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String x、 xxxx不是有效的浮点。在语言/本地语言之间转换_String_Delphi_Floating Point - Fatal编程技术网

String x、 xxxx不是有效的浮点。在语言/本地语言之间转换

String x、 xxxx不是有效的浮点。在语言/本地语言之间转换,string,delphi,floating-point,String,Delphi,Floating Point,我有一位西班牙用户,在执行此操作时遇到无效浮点错误 var S : String; R : Real; begin S := '3.12345'; R := StrToFloat(S); //- Exception here. 原因是他的位置使用了,作为小数点 如何安全地将上面的字符串转换为浮点数,而不使其爆炸。如果知道字符串使用作为十进制分隔符,请使用t格式设置的strotfloat的第二个重载,那么你应该做一些类似的事情 procedure TForm1.FormCreat

我有一位西班牙用户,在执行此操作时遇到
无效浮点错误

var
  S : String;
  R : Real;
begin
  S := '3.12345';
  R := StrToFloat(S); //- Exception here.
原因是他的位置使用了
作为小数点

如何安全地将上面的字符串转换为浮点数,而不使其爆炸。

如果知道字符串使用
作为十进制分隔符,请使用
t格式设置的
strotfloat
的第二个重载,那么你应该做一些类似的事情

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.UpdateFormatSettings := false;
  DecimalSeparator := '.';
end;
线路

Application.UpdateFormatSettings := false;

这是非常重要的。此属性的默认值为
true
,在这种情况下,
小数分隔符
变量可以随时恢复为其默认值(例如,
),例如在切换用户时。

滚动您自己的StrToFloat版本

function StrToFloat_UK(const AStr: string): Float;
var
  FS: TFormatSettings;
begin
  FS.Create('en-UK');
  Result:= StrToFloat(AStr, FS): 
end;

并用它代替StrToFloat。

您可以使用过程
val
,它忽略本地系统设置

var
S : String;
R : Real;
Test: Integer;
begin
  S := '3.12345';
  Val(S, R, Test);
end;

你知道(也就是说,在程序运行时)字符串中使用的国家设置吗?是的,我知道(作为字符串的原因是它是一个API响应)。现在我完全不知道你在做什么
t格式设置
是一个记录,你知道吗?从embarcadero文档中:1。声明类型为TFormatSettings的变量。2.调用TFormatSettings.Create以使用区域设置信息填充TFormatSettings变量。3.将TFormatSettings变量作为字符串格式化例程的最后一个参数传递。好吧,它不会为我编译。从什么时候开始你需要
免费
一张唱片?!也许您正在使用更新版本的Delphi。在Delphi 2009中,上面的代码是胡说八道的……好吧,我现在看到这个记录自Delphi 2009以来发生了变化,但是,即使在Delphi XE中,您也不应该
免费
它!避免使用全局
小数分隔符
,因为您将不知道该分隔符依赖于哪些其他单位(以及哪些单位将中断)。最好使用本地
t格式设置
实例。-1:忽略应用程序中所有内容的用户设置不是一个好办法,特别是当您可以使用Joey和Johan报告的重载版本时。由于源代码原因,我选择了另一个版本而不是您的版本,但两者基本相同。谢谢你的回答@维扎德:没关系。我不知道如何初始化
t格式设置。这是几年来,我做对象帕斯卡,从来没有处理过这个问题;这个答案主要是快速网络搜索的结果(我相当确定每个对区域设置敏感的解析函数都必须有一个选项来预先设置要使用的区域设置)。但我希望Val不仅仅局限于真实类型,而且可以很好地使用Double。希望double?的重载也适用于double和Int。它本身不是重载的,而是编译器的魔力。