【问题标题】:XE2 XML Attribute can't convert to doubleXE2 XML 属性无法转换为双精度
【发布时间】:2012-06-05 09:29:10
【问题描述】:

我有一个具有如下属性的 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) 中的正确值

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

// 谢谢

【问题讨论】:

    标签: xml type-conversion c++builder-xe2


    【解决方案1】:

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

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

    TFormatSettings fmt = TFormatSettings::Create();
    fmt.DecimalSeparator = '.';
    double x = StrToFloat(XMLNode->Attributes["x"], fmt); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2015-04-24
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多