Форматирование валюты

Это должно быть легкой проблемой, но...

Мне нужно отформатировать валюту для отображения (строки) в 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)));
Другие вопросы по тегам