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

Преобразуйте любую строку валюты в двойную

Мне нужно хранить несколько валют на сервере SQL. Я понимаю, что SQL не будет поддерживать все разные типы валют (если я не сохраню его как строку, но я не хочу этого делать).

Моя идея состояла в том, чтобы преобразовать все значения из своего валютного формата в стандартный двойной и сохранить это вместо. Затем просто переформатируйте на основе информации о культуре при отображении. Тем не менее, я попытался сделать что-то вроде, например.

var cultureInfo = new System.Globalization.CultureInfo("en-US");
double plain = return Double.Parse("$20,000.00", cultureInfo);

Это никогда не работает, он всегда бросает FormatException. Даже удаление символа валюты и просто попытка сделать это, основываясь только на номере, делает то же самое. Это просто пример того, что я хочу поддерживать практически любую валюту.

Есть ли стандартный способ удаления валюты и получения значения в виде двойной?

4b9b3361

Ответ 1

Я думаю, что это должно сработать:

double.Parse(currencyValue, NumberStyles.Currency);

Здесь вы можете узнать больше о NumberStyles.

Изменить: в случае, если кто-либо увидит этот ответ, не глядя на другие ответы/комментарии, этот ответ ответил на вопрос как написанный, но хранение валюты как double не является хорошей идеей, и было бы лучше использовать decimal вместо.

Ответ 2

Вы должны передать NumberStyles в функцию Parse

Decimal.Parse("$20,000.00", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, new CultureInfo("en-US"));

Несколько других вещей, для валют, я предлагаю вам использовать Decimal. И это может быть совсем не так, но лучше хранить данные о валюте как деньги в БД и добавить валютный код, чтобы идентифицировать валюту значения.

Да, и ответы подскажут NumberStyles.Currency, что было бы лучше. Это значение pre-Or'd, если вы все еще думаете, что хотите использовать строки.

Ответ 3

Вы также можете использовать tryparse()

string input = "$2,000.00";
double parsed = 0d;
double.TryParse(input, NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out parsed))