Проблема разбора текста валюты в десятичный тип
Я пытаюсь разобрать строку типа "$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). Региональный формат должен быть в США.
Я работаю в Индии, эти изменения работают на меня. Пожалуйста, поправьте меня, если это не так.