【问题标题】:Parsing of a decimal type in C# fails unexpectedly在 C# 中解析十进制类型意外失败
【发布时间】:2020-01-20 14:10:43
【问题描述】:

我正在从一个返回对象数组的 Web 服务解析 XML 文档。

一个对象的字段包含浮点值,它看起来像这样:

<Valute ID="R01010">
<NumCode>036</NumCode>
<CharCode>AUD</CharCode>
<Nominal>1</Nominal>
<Name>Australian Dollar</Name>
<Value>14,4200</Value>
</Valute>

我成功地将文档读入XDocument 对象,如下所示:

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (var sr = new System.IO.StreamReader(response.GetResponseStream(), Encoding.GetEncoding(response.CharacterSet)))
{
    XDocument xmlDoc = new XDocument();
    try
    {
        xmlDoc = XDocument.Parse(sr.ReadToEnd());

        DesiredDate = DateTime.ParseExact(xmlDoc.Element("ValCurs").Attribute("Date").Value, "dd.MM.yyyy", new CultureInfo("ru-RU"));

        result = new List<CBRItem>();

        foreach (var valuteElement in xmlDoc.Element("ValCurs").Elements("Valute"))
        {
            CBRItem item = CBRItem.FromXElement(valuteElement);

            if (item != null)
            {
                result.Add(item);
            }
            else
            {
                Console.WriteLine("Could not convert from Valute XML element:\n" + valuteElement.ToString());
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

我像这样处理数组中的每个对象:

public static CBRItem FromXElement(XElement elem)
{
    CBRItem result = new CBRItem();

    try
    {
        result.ID = elem.Attribute("ID").Value;
        result.NumCode = elem.Element("NumCode").Value;
        result.CharCode = elem.Element("CharCode").Value;
        result.Nominal = short.Parse(elem.Element("Nominal").Value, new CultureInfo("ru-RU"));
        result.Name = elem.Element("Name").Value;
        result.Value = decimal.Parse(elem.Element("Value").Value, new CultureInfo("ru-RU"));
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }

    return result;
}

我已经调试了我的代码,并验证了我传递给FromXElement 函数的XElement 对象填充了适当的数据(如开头所述)。

但我在 decimal 解析行上得到了一个 System.FormatException

result.Value = decimal.Parse(elem.Element("Value").Value, new CultureInfo("ru-RU"));

在某些 PC 上,但不是我的或我工作的那台。

这真的很奇怪,我什至指定了文化,以消除由于NumberDecimalSeparator 在当前文化中不是逗号而可能发生的解析错误。 (文化是ru-RU,因为网络服务是俄语,我认为在这种情况下这是合适的选择)

那么,是什么导致了这个问题?

【问题讨论】:

  • 你认为14,4200 会怎样出现?如果“,”是小数,那么它将是 14,42 - 到目前为止一切都很好。但如果它明确不是小数,那么它是什么? 1000 年 9 月?那么应该是144,200 ...
  • @Fildor,网络服务使用, 作为小数分隔符
  • 啊,那我误会最后一段了,抱歉。
  • 它使用 1000-sep 吗? API 是否有文档,说明在哪里,它到底是什么文化?
  • @Fildor 不,我找不到有关 1000 年 sep 或文化的任何信息。实际上,这是服务示例:cbr.ru/scripts/XML_daily.asp?date_req=21/11/2000

标签: c# .net parsing xml-parsing


【解决方案1】:

可能NumberDecimalSeparator 在您的系统上设置为不同于, 的文化ru-RU

您可以在CultureInfo 上显式设置NumberDecimalSeparator

var cultureInfo = new CultureInfo("ru-RU");
cultureInfo.NumberFormat.NumberDecimalSeparator = ",";

...

result.Value = decimal.Parse(elem.Element("Value").Value, cultureInfo);

【讨论】:

  • @lilbroomstick:刚刚看到你的编辑,这个问题不会出现在你自己的机器上,而只是出现在其他一些机器上。可能在那些系统文化 ru-RU 上配置不同
猜你喜欢
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多