将货币文本解析为十进制类型的问题

时间:2011-02-10 03:25:19

标签: c# parsing decimal number-formatting

我正在尝试将像“$ 45.59”这样的字符串解析为小数。出于某种原因,我得到的例外是输入格式不正确。我并不关心所有本地化的东西,因为这不是一个全球性的计划。这就是我在做的事情。你看到有什么问题吗?

NumberFormatInfo MyNFI = new NumberFormatInfo(); 
MyNFI.NegativeSign = "-"; 
MyNFI.NumberDecimalSeparator = "."; 
MyNFI.NumberGroupSeparator = ",";
MyNFI.CurrencySymbol = "$"; 
decimal d  = decimal.Parse("$45.00", MyNFI);    // throws exception here...

3 个答案:

答案 0 :(得分:99)

如何使用:

decimal d = decimal.Parse("$45.00", NumberStyles.Currency);

Decimal.Parse上的MSDN文档声明:

  

“使用NumberStyles.Number样式解释s参数。这意味着允许使用空格和千位分隔符,但不允许使用货币符号。要明确定义元素(例如货币符号,千位分隔符和空格)可以出现在s中,使用Decimal.Parse(String,NumberStyles,IFormatProvider)方法

答案 1 :(得分:14)

这种方式对我有用:

NumberFormatInfo MyNFI = new NumberFormatInfo();
MyNFI.NegativeSign = "-";
MyNFI.CurrencyDecimalSeparator = ".";
MyNFI.CurrencyGroupSeparator = ",";
MyNFI.CurrencySymbol = "$";

decimal d = decimal.Parse("$45.00", NumberStyles.Currency, MyNFI);

1。)您必须定义货币分隔符而不是数字分隔符。 2.)因为您只定义了货币值,所以您需要在解析时定义NumberStyles.Currency。

答案 2 :(得分:0)

当我尝试从@JohnKoerner运行代码时,它将失败并出现以下异常: System.FormatException,并显示消息:"Input string was not in a correct format."。 @MEN的答案很有帮助,但我想对接受的答案以及如何解决该问题添加一些其他见解。

就像@MEN一样,在NumberFormatInfo方法正常工作之前,我必须添加.Parse()。但是,对于我来说,不需要用CurrencyDecimalSeparator指定小数。您必须包括数字所需的所有属性。这是类定义文档中的列表:

MSDN Docs - NumberFormatInfo Class

在我的实现中,我永远不会得到负数,所以我选择不包括负数。这是我所拥有的:

string currencyAmount = "$45.00";

NumberFormatInfo FormatInfo = new NumberFormatInfo();
FormatInfo.CurrencyGroupSeparator = ",";
FormatInfo.CurrencySymbol = "$";

// Result: 45.00
decimal parsedCurrency = decimal.Parse(currencyAmount, NumberStyles.Currency, FormatInfo);