Val似乎只接受包含的字符串.作为小数分隔符.
从_ValExt(Val调用)中的ASM代码看起来它不使用DecimalSeparator.
我可以安全地依赖Val接受实数字符串的事实(?).作为小数分隔符?
解决方法
看看下面的测试代码.在我的德语系统中,小数点分隔符是逗号.所以我尝试了以下方法:
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',Code); if Code = 0 then Writeln('1,234 Extended: ',E) else Writeln('1,234 Extended: Error,Code); Val('1.234',S,Code); if Code = 0 then Writeln('1.234 Single: ',S) else Writeln('1.234 Single: Error,Code); Val('1234',I,Code); if Code = 0 then Writeln('Integer: ',I) else Writeln('Integer: Error,Code); end;
输出是:
1.234 Extended: 1.23400000000000E+0000 1,code = 2 1.234 Single: 1.23399996757507E+0000 Integer: 1234
这清楚地表明Val不使用系统定义的小数分隔符,只接受不变的小数分隔符,即’.’. IMO,System.Val的文档在这里有点误导.
UPDATE
似乎我在代码的“单个部分”中使用了E而不是S.如果你传递一个Single,显然你也得到正确的值,所以我猜编译器(它知道传递了什么)以某种方式将这些信息传递给内部例程.
查看cpu窗口,您可以看到,如果传入浮点类型,则调用System.@ ValExt,它返回FPU堆栈顶部的值(ST(0)).编译器添加适当的代码来存储该值(分别为Extended,Double和Single的FSTP TBYTE,FSTP QWORD或FSTP DWORD).
类似地,对于整数变量(最多32位),调用System.@ValLong,它在EAX中返回一个Integer,并且编译器添加用于以正确大小存储值的适当代码.对于64位整数,调用@ ValInt64,它在EDX:EAX中返回一个值.
FWIW,它还表明Writeln不使用系统定义的小数分隔符.
原文地址:https://www.jb51.cc/delphi/239244.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。