如何设置XML解析器';s小数点字符?
我正在读取XML文档中的属性字段,其中小数点始终是如何设置XML解析器';s小数点字符?,xml,c++builder,decimal-point,firemonkey-fm3,c++builder-xe5,Xml,C++builder,Decimal Point,Firemonkey Fm3,C++builder Xe5,我正在读取XML文档中的属性字段,其中小数点始终是。,本地计算机可能与此不同(在我自己的情况下,它是,') 我试图将全局格式设置.DecimalSeparator设置为。但对XML解析器没有影响。这是一个非常压缩的问题版本 _di_IXMLDocument Document; _di_IXMLNode Node; float Value; Document = LoadXMLDocument("Test.xml"); Node = Document->Doc
。
,本地计算机可能与此不同(在我自己的情况下,它是,'
)
我试图将全局格式设置.DecimalSeparator设置为。
但对XML解析器没有影响。这是一个非常压缩的问题版本
_di_IXMLDocument Document;
_di_IXMLNode Node;
float Value;
Document = LoadXMLDocument("Test.xml");
Node = Document->DocumentElement;
FormatSettings.DecimalSeparator = '.';
Value = Node->GetAttribute("scale");
假设这个XML文件
<?xml version="1.0" encoding="utf-8"?>
<myroot scale="1.234">
</myroot>
读取属性比例后,我总是在“.”字符上获得条带化的结果,结果是值=1234,而不是1.234
小数的数目不是常数,它们可以是1或4或介于两者之间的任何数字。这也适用于整个部分,因此除以100或1000并不能解决问题
_di_IXMLDocument Document;
_di_IXMLNode Node;
float Value;
Document = LoadXMLDocument("Test.xml");
Node = Document->DocumentElement;
FormatSettings.DecimalSeparator = '.';
Value = Node->GetAttribute("scale");
我希望OLEVariant接受'。
作为小数点(我的本地代码是,'
)
我查看了SetLocalInfo()
,但这将设置所有应用程序的格式。getlocale()
函数操作当前线程,但我还没有找到一种方法来显式指定要使用的字符。似乎只能选择代码页或本地化,就像在一个国家一样
编辑
我尝试使用setlocal()
并选择English-US
作为本地化。即使我们使用。
作为十进制分隔符,XML解析器似乎也忽略了这一点
如果我手动将XML文件中的'.
更改为,'
,则效果良好。但是XML文件是第三方文件,我无法控制它。因此,我确实需要按照使用”的方式来阅读它。
十进制分隔符这是IXMLNode.NodeValue
属性处理浮点数的方式中的一个众所周知的问题。它与底层XML引擎(MSXML等)无关
NodeValue
属性getter返回一个OleVariant
,该变量将属性值作为字符串
,而不是浮点
。然后将该OleVariant
分配给float
。RTL使用操作系统区域设置而不是RTL定位设置执行转换,这就是为什么FormatSettings
无效的原因
NodeValue
属性设置器接收一个OleVariant
作为输入。将值插入XML DOM时,将浮点值
直接传递给它将执行到字符串
的转换,并且该转换也与格式设置
无关
NodeValue
对区域设置敏感,但XML不敏感。XML标准明确地概述了浮点数必须如何格式化,而IXMLNode
没有考虑到这一点。因此,您必须将浮点值读/写为String
值,以便自己处理转换,例如:
TFormatSettings fmt = TFormatSettings::Create();
fmt.DecimalSeparator = '.';
fmt.ThousandSeparator = 0;
Value = StrToFloat(Node->Attributes["scale"], fmt);
这是众所周知的IXMLNode.NodeValue属性处理浮点数的方式问题。它与底层XML引擎(MSXML等)无关
NodeValue
属性getter返回一个OleVariant
,该变量将属性值作为字符串
,而不是浮点
。然后将该OleVariant
分配给float
。RTL使用操作系统区域设置而不是RTL定位设置执行转换,这就是为什么FormatSettings
无效的原因
NodeValue
属性设置器接收一个OleVariant
作为输入。将值插入XML DOM时,将浮点值
直接传递给它将执行到字符串
的转换,并且该转换也与格式设置
无关
NodeValue
对区域设置敏感,但XML不敏感。XML标准明确地概述了浮点数必须如何格式化,而IXMLNode
没有考虑到这一点。因此,您必须将浮点值读/写为String
值,以便自己处理转换,例如:
TFormatSettings fmt = TFormatSettings::Create();
fmt.DecimalSeparator = '.';
fmt.ThousandSeparator = 0;
Value = StrToFloat(Node->Attributes["scale"], fmt);
(这不是一个标准的XML问题,它是专门针对Microsoft的,不可移植。因此,我的答案不直接适用,我将向您推荐Microsoft。)(这不是一个标准的XML问题,它是专门针对Microsoft的,不可移植。因此,我的答案不直接适用,我将向您推荐Microsoft。)谢谢你的深刻解释。我最终得到了与您的建议类似的字符串转换。你确认失败的不是我;)谢谢你的深刻解释。我最终得到了与您的建议类似的字符串转换。你确认失败的不是我;)