Проблема разбора текста валюты на десятичный тип
Я пытаюсь проанализировать строку типа "$ 45.59" в десятичную. По какой-то причине я получаю исключение, что вход был не в правильном формате. Меня не волнует вся информация о локализации, потому что это не будет глобальная программа. Вот что я делаю. Вы видите какие-либо проблемы?
NumberFormatInfo MyNFI = new NumberFormatInfo();
MyNFI.NegativeSign = "-";
MyNFI.NumberDecimalSeparator = ".";
MyNFI.NumberGroupSeparator = ",";
MyNFI.CurrencySymbol = "$";
decimal d = decimal.Parse("$45.00", MyNFI); // throws exception here...
Ответы
Ответ 1
Как насчет использования:
decimal d = decimal.Parse("$45.00", NumberStyles.Currency);
Документация MSDN на Decimal.Parse гласит:
"Параметр s интерпретируется с использованием стиля NumberStyles.Number.Это означает, что разделители пробелов и тысяч разрешены, но символы валют - нет. Чтобы явно определить элементы (например, символы валюты, разделители тысяч и пробелы) который может присутствовать в s, использовать метод Decimal.Parse(String, NumberStyles, IFormatProvider)
Ответ 2
Таким образом, это работает для меня:
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 во время разбора.
Ответ 3
Когда я попытался запустить код из @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);