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

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

Это должна быть простая проблема, но...

Мне нужно форматировать валюту для отображения (строки) в С#

Соответствующая валюта будет иметь свои собственные правила, такие как используемый символ, и если этот символ должен быть до значения (например, 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 ₫ - Правильный символ, неправильное использование и. для текущего пользователя.

Этот пост дает больше подробностей о том, что нужно делать, но не о том, как это сделать.

Какой очевидный метод скрыт в структуре, я не хватает?

4b9b3361

Ответ 1

  • Возьмите 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));
    }
}

Правда, моей консоли не удается отобразить правильный символ, но я уверен, что только из-за проблем с шрифтом:)

Ответ 2

Извините, я могу быть здесь немного медленнее, но я до сих пор не вижу вашей точки. Мне кажется, что первоначальный вопрос: "У меня есть ценность донга, которую во Вьетнаме я хочу отображать в соответствии с вьетнамским валютным форматом с символом" ₫ ", а в США я хочу отображать в соответствии с форматом валюты США, но все еще с" ₫".

Я думаю, что меня путают два противоречивых заявления... "В рассматриваемой валюте будут свои собственные правила" и "как форматируются числа, зависит от локальных пользователей [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);

Ответ 3

Чтобы работать с текстовым полем, попробуйте следующее:

textBox2.Text = "Rp" + (textBox1.Text = string.Format(System.Globalization.CultureInfo.GetCultureInfo("id-ID"), "{0:#,##0.00}", double.Parse(textBox1.Text)));