Подтвердить что ты не робот

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

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

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

Ответ 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);