gpt4 book ai didi

delphi - Val 过程是否使用 DecimalSeparator?

转载 作者:行者123 更新时间:2023-12-03 14:52:37 25 4
gpt4 key购买 nike

StrToFloat 使用格式设置的DecimalSeparator

似乎 Val 只接受包含 . 作为小数分隔符的字符串。

_ValExt 中的 ASM 代码(Val 调用)来看,它似乎没有使用 DecimalSeparator

我可以放心地相信 Val 接受以 . 作为小数点分隔符的实数字符串吗?

最佳答案

Val 是古老的、低级的并且使用起来有点棘手。我不建议在用户代码中使用它。而是使用其他例程来扫描值,例如 StrToFloat 等。如果将 StrToFloatTFormatSettings.Invariant 一起使用,则可以确保得到点 ('.') 作为小数点分隔符。

看一下下面的测试代码。在我的德语系统上,小数点分隔符是逗号。所以我尝试了以下方法:

procedure Test;
var
E: Extended;
S: Single;
I: Integer;
Code: Integer;
begin

Val('1.234', E, Code);
if Code = 0 then
Writeln('1.234 Extended: ', E)
else
Writeln('1.234 Extended: Error, code = ', Code);

Val('1,234', E, Code);
if Code = 0 then
Writeln('1,234 Extended: ', E)
else
Writeln('1,234 Extended: Error, code = ', Code);

Val('1.234', S, Code);
if Code = 0 then
Writeln('1.234 Single: ', S)
else
Writeln('1.234 Single: Error, code = ', Code);

Val('1234', I, Code);
if Code = 0 then
Writeln('Integer: ', I)
else
Writeln('Integer: Error, code = ', Code);

end;

输出为:

1.234 Extended:  1.23400000000000E+0000
1,234 Extended: Error, code = 2
1.234 Single: 1.23399996757507E+0000
Integer: 1234

这清楚地表明Val不使用系统定义的小数分隔符,而只接受不变的小数分隔符,即'.'。 IMO,System.Val 的文档在这里有点误导。

更新

似乎我在代码的“单个部分”中使用了 E 而不是 S 。显然,如果您传递 Single,您也会获得正确的值,所以我猜编译器(知道传递的内容)以某种方式将此信息传递给内部例程。

查看CPU窗口,可以看到如果传入浮点类型,就会调用System.@ValExt,返回FPU栈顶的值(ST(0))。然后,编译器添加适当的代码来存储该值(用于扩展FSTP TBYTEFSTP QWORDFSTP DWORD,分别)。

同样,对于整型变量(最多 32 位),会调用 System.@ValLong,它会在 EAX 中返回一个 Integer code>,编译器会添加适当的代码来以正确的大小存储该值。对于 64 位整数,调用 @ValInt64,它返回 EDX:EAX 中的值。

FWIW,它还表明 Writeln 不使用系统定义的小数分隔符。

关于delphi - Val 过程是否使用 DecimalSeparator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47959910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com