0

我有一个具有如下属性的 XML 节点:

<pad name="E" x="2.5" y="7" drill="1.3"/>

当我将结果分配Attributes["x"]为双精度时,我得到的结果是 25,而不是 2.5,但没有任何抱怨或错误。

要获得正确的转换,我首先必须将属性分配给字符串,替换小数点 '.' 转换为十进制 ',',然后将字符串转换为双精度。很明显,Attribute["x"]不能转换,但它什么也没说!(漏洞?!?)

这是转换错误的代码:

double x = XMLNode->Attributes["x"];

这给出了 25 而不是 2.5 的错误 x,这是我的解决方法:

String sd = XMLNode->Attributes["x"];
if (sd.Pos(".")) sd[sd.Pos(".")] = ',';
double x = sd.ToDouble();

这给出了 x (2.5) 中的正确值

必须有一个更简单的方法来做到这一点!

// 谢谢

4

1 回答 1

1

如果您不使用 XSD 来凝聚数据,则 XML 属性是任意字符串值,例如使用 IDE 的 XML 数据绑定向导。该Attributes[]属性返回 a OleVariant,在本例中将包含 a System::String。当使用' 的转换运算符或方法将 aSystem::String转换为 a时,转换使用全局变量,该变量使用 PC 的区域设置初始化,显然使用字符作为小数分隔符而不是字符。XML 无法知道该区域设置。doubleOleVariantdoubleString::ToDouble()SysUtils::DecimalSeparator,.

由于您使用的是现代版本的 C++Builder,因此您可以使用该StrToFloat()函数的重载版本,它允许您将TFormatSettings记录作为输入传递。然后,您可以.指定TFormatSettings::DecimalSeparator用于转换的 ,例如:

TFormatSettings fmt = TFormatSettings::Create();
fmt.DecimalSeparator = '.';
double x = StrToFloat(XMLNode->Attributes["x"], fmt); 
于 2012-06-05T01:29:10.457 回答