如何设置XML解析器';s小数点字符?

如何设置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

我正在读取XML文档中的属性字段,其中小数点始终是
,本地计算机可能与此不同(在我自己的情况下,它是
,'

我试图将全局
格式设置.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。)谢谢你的深刻解释。我最终得到了与您的建议类似的字符串转换。你确认失败的不是我;)谢谢你的深刻解释。我最终得到了与您的建议类似的字符串转换。你确认失败的不是我;)