Проблема разбора текста валюты в десятичный тип

Я пытаюсь разобрать строку типа "$45,59" в десятичную. По какой-то причине я получаю исключение, что ввод был не в правильном формате. Меня не волнуют все вещи по локализации, потому что это не будет глобальной программой. Вот что я делаю. Вы видите какие-либо проблемы?

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

4 ответа

Решение

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

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

Документация MSDN на Decimal.Parse гласит:

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

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

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

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

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

Документы MSDN - Класс NumberFormatInfo

Я никогда не получу отрицательные числа в своей реализации, поэтому решил не включать это. Вот что у меня есть:

string currencyAmount = "$45.00";

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

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

Пожалуйста, проверьте региональные настройки в Windows. если валюта как в долларах США ($200). Региональный формат должен быть в США.

Я работаю в Индии, эти изменения работают на меня. Пожалуйста, поправьте меня, если это не так.

Другие вопросы по тегам