Форматирование валюты
Это должно быть легкой проблемой, но...
Мне нужно отформатировать валюту для отображения (строки) в C#
У рассматриваемой валюты будут свои собственные правила, такие как используемый символ, и если этот символ должен стоять перед значением (например, 10 долл. США) или после (например, 10 ₫, который является вьетнамским донгом).
Но то, как числа отформатированы, зависит от локальных пользователей, а не от валюты.
Например
1.234,56 ₫ should be displayed to a user in Vietnam but
1,234.56 ₫ should be displayed to a user in the US
(отформатирован как код, поэтому легко увидеть разницу между и.)
Так что код вроде
Double vietnamTotal = 1234.56;
return vietnamTotal.ToString("c");
Не будет работать, так как он будет использовать языковой стандарт пользователей (или более точно CultureInfo.CurrentCulture) для формата и валюты, поэтому вы получите такие вещи, как $ 1 123,56 - правильное использование и. но неправильный символ.
Double vietnamTotal = 1234.56;
CultureInfo ci = new CultureInfo(1066); // Vietnam
return vietnameTotal.ToString("c",ci));
Даст 1,234,56 Right - правильный символ, неправильное использование и. для текущего пользователя.
Этот пост дает более подробную информацию о том, что нужно делать, но не о том, как это сделать.
Какой очевидный метод, скрытый в рамках, мне не хватает?
3 ответа
- Возьмите
NumberFormatInfo
из валюты пользователя, и клонировать его - Установить
CurrencySymbol
в клонированном формате вCurrencySymbol
рассматриваемой валюты - Если вы хотите скопировать валютную позицию (и некоторые другие аспекты формата), установите
CurrencyPositivePattern
а такжеCurrencyNegativePattern
таким же образом. - Используйте результат для форматирования.
Например:
using System;
using System.Globalization;
class Test
{
static void Main()
{
decimal total = 1234.56m;
CultureInfo vietnam = new CultureInfo(1066);
CultureInfo usa = new CultureInfo("en-US");
NumberFormatInfo nfi = usa.NumberFormat;
nfi = (NumberFormatInfo) nfi.Clone();
NumberFormatInfo vnfi = vietnam.NumberFormat;
nfi.CurrencySymbol = vnfi.CurrencySymbol;
nfi.CurrencyNegativePattern = vnfi.CurrencyNegativePattern;
nfi.CurrencyPositivePattern = vnfi.CurrencyPositivePattern;
Console.WriteLine(total.ToString("c", nfi));
}
}
По общему признанию моя консоль не в состоянии отобразить правильный символ, но я уверен, что это только из-за проблем со шрифтом:)
Извините, я могу быть немного медленным здесь, но я все еще не понимаю вашу точку зрения. Мне кажется, что первоначальный вопрос звучит так: "У меня есть значение Донга, которое во Вьетнаме я хочу отображать в формате вьетнамской валюты с символом", ", а в США я хочу отображать в формате американской валюты, но все еще с "₫". ",
Полагаю, меня смущают два противоречивых утверждения... "У рассматриваемой валюты будут свои правила", а "отформатирование чисел зависит от локальных пользователей [sic], а не от валюты".
Если бы все, что вы хотели изменить, - это символ валюты и оставил форматирование в соответствии с текущей культурой, разве клонирования nfi и установки символа было бы достаточно?
NumberFormatInfo nfi;
// pretend we're in Vietnam
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("vi-VN");
nfi = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo;
nfi.CurrencySymbol = "₫";
String s1 = (1234.5678).ToString("c", nfi);
// pretend we're in America
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
nfi = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo;
nfi.CurrencySymbol = "₫";
String s2 = (1234.5678).ToString("c", nfi);
Чтобы работать с текстовым полем, попробуйте следующее:
textBox2.Text = "Rp" + (textBox1.Text = string.Format(System.Globalization.CultureInfo.GetCultureInfo("id-ID"), "{0:#,##0.00}", double.Parse(textBox1.Text)));