Convert.ToDecimal 抛出 System.FormatExcept

Convert.ToDecimal throws System.FormatExcept

我正在尝试从 xml 文件中解析一个值,例如 2.25 是一个用“,”分隔的小数。

decimal hrsElapsed = Convert.ToDecimal(caseNode["hrsElapsed"].InnerText, new NumberFormatInfo() {NumberDecimalSeparator = ","})

但是,我得到一个 System.FormatException 。同行代码应用到其他字段不抛。例如这里:

decimal hrsOrigEst = Convert.ToDecimal(caseNode["hrsOrigEst"].InnerText, new NumberFormatInfo() {NumberDecimalSeparator = ","});

我查看了 caseNode[""].InnerText 的实际值是“2.25”,所以我看不出为什么会出现格式异常。有什么想法吗?

NumberFormatInfo 为转换器提供有关如何将字符串 caseNode["hrsElapsed"] 转换为小数的提示。因为你的字符串包含一个“。”而不是逗号,它无法解析它。

数据类型decimal没有数字小数点分隔符的概念,只有它的字符串表示形式。

尝试删除 NumberDecimalSeperator,当您将小数转换回字符串时,请改用它。

小数没有隐含的小数点分隔符,如果将小数点转换为一,则字符串可能会有。所以你需要一个NumberFormatInfo/CultureInfo,它使用一个点作为小数分隔符来将字符串解析为decimal,f.e。 CultureInfo.InvariantCulture:

decimal hrsElapsed = decimal.Parse(caseNode["hrsElapsed"].InnerText, CultureInfo.InvariantCulture);

现在您需要一个 NumberFormatInfo/CultureInfo,它使用逗号作为 decimal.ToString:

的小数点分隔符
string hrsElapsedWithComma = hrsElapsed.ToString(new CultureInfo("de-DE")); // or another one that uses comma as decimal separator

decimal类型是数字类型,它本身没有任何格式。所以C#中没有'a decimal separated by ","'这样的东西。有小数,也有通过格式化小数创建的字符串。

您提供给 Convert.ToDecimal 的格式是用于将字符串转换为小数的格式。由于您正在转换的字符串使用句点,因此您应该在您的格式中使用它。

然后要使用逗号将该十进制数转换为表示形式,请使用合适的格式将其转换为字符串。

        decimal hrsElapsed = Convert.ToDecimal("2.5", new NumberFormatInfo() {NumberDecimalSeparator = "."});
        string representationWithComma = hrsElapsed.ToString( new NumberFormatInfo() {NumberDecimalSeparator = ","});