Как правильно форматировать текст в зависимости от валюты

В моем приложении выполняется расчет, который отображает текст в графическом интерфейсе. Приложение умножает заданную пользователем сумму на определенное число (скажем, 0,85), чтобы получить итог (пользователь вводит 2, приложение вычисляет 2 x 0,85).

Поскольку отображаемое число соответствует валюте, я пытаюсь правильно отформатировать текст, чтобы сделать его читабельным и правильным.

До сих пор я пытался

.ToString("N2");

Это только что привело к добавлению двух дополнительных нулей в конец рисунка.

Проблема видна здесь:

Ошибка!

Как вы можете видеть, правильное значение равно 0,68 (или 0,68 фунта стерлингов), а мой текст показывает 68,00 фунтов стерлингов. Удаление «N2» из ToString действительно помогает, но у меня все еще остается 68 фунтов стерлингов.

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

Спасибо!

Примечание. Данные хранятся в виде двойного числа и ранее были числом с плавающей запятой, приложение может быть гибко изменено. Значок валюты также не нужен, так как я предоставляю его вручную, необходимо только форматирование.


person Jamie Keeling    schedule 28.06.2010    source источник


Ответы (3)


На первый взгляд кажется, что вы умножили свое значение (0,68) на 100, чтобы получить 68,00, что было бы правильно. Однако ваше количество равно 80, что должно дать вам значение 54,40.

Если умножить на 2, то должно получиться 1,70.

person ChrisF    schedule 28.06.2010
comment
Спасибо за помощь, после ручной работы кажется, что я пропустил два десятичных знака в определенной переменной. После редактирования значения текст корректируется должным образом. - person Jamie Keeling; 29.06.2010

Попробуй это:

string.Format("{0:C}", money_value);

Это также будет работать:

.ToString("C");

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

Если вы хотите сделать все возможное, вы можете сделать это:

string.Format(ui_culture, “{0:C}”, money_value);

где ui_culture — культура, связанная с валютой.

Отредактировано для добавления:

Преимущество этого форматирования в том, что оно управляет всей вашей пунктуацией.

Я не уверен, что символы валюты всегда являются ведущим символом. Если это так, вы можете удалить его:

string.Format(ui_culture, “{0:C}”, money_value).substring(1);
person egrunin    schedule 28.06.2010
comment
Это будет включать символ валюты — msdn.microsoft.com/ en-us/library/dwhawy9k(VS.71).aspx — но на снимке экрана это не нужно, так как оно уже присутствует в виде метки. - person ChrisF; 29.06.2010
comment
Я проголосовал за ответ, так как он был очень полезен, но другому ответу удалось это исправить. Кроме того, если бы мое приложение не нуждалось в раскрывающемся списке и зависело бы от языка, определяемого пользователем, тогда ваше решение определенно было бы выбрано. - person Jamie Keeling; 29.06.2010

Вам нужно будет использовать перегрузку ToString, которая принимает параметр IFormatProvider:

double value = 80;
string ukCurrency = value.ToString("N2", CultureInfo.CreateSpecificCulture("en-GB"));

На самом деле я не уверен, будет ли это включать символ валюты (непроверенный пример). Я надеюсь, что использование строки формата «N2» удалит символ валюты... но это может и не быть. Может быть достаточно просто пропустить первый символ строки:

ukCurrency = ukCurrency.Substring(1);
person jrista    schedule 28.06.2010