Проблема при разборе текста валюты на десятичный тип - PullRequest
46 голосов
/ 10 февраля 2011

Я пытаюсь разобрать строку типа «$ 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 ]

100 голосов
/ 10 февраля 2011

Как насчет использования:

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

Документация MSDN на Десятичный. Параллельный состояния:

"Параметр s интерпретируется с использованием стиля NumberStyles.Number. Это означает, что пробелы и разделители тысяч допускаются, а символы валюты - нет. Для явного определения элементов (таких как символы валют, разделители тысяч и пробелы) которые могут присутствовать в s, используйте метод Decimal.Parse (String, NumberStyles, IFormatProvider)

14 голосов
/ 07 мая 2013

Так у меня работает:

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 при разборе.

0 голосов
/ 14 июня 2019

Когда я пытался запустить код из @JohnKoerner, произошел сбой, за исключением: System.FormatException с сообщением: "Input string was not in a correct format.".Ответ @ MEN был полезен, но я хотел добавить дополнительную информацию о принятом ответе и о том, как решить эту проблему.

Так же, как @MEN, мне пришлось включить NumberFormatInfo, прежде чем метод .Parse() сработалдолжным образом.Однако указывать десятичную с CurrencyDecimalSeparator мне не нужно.Вы должны будете включить все свойства, которые вам нужны для ваших номеров.Вот список документов определения класса:

Документы MSDN - 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);
...