2009-07-01 9 views
22

Это должна быть легкой задачей, но ...валюты форматирование

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

Валюты вопроса будет иметь свои собственные правила, такие как символ для и если этот символ должен быть до значения (например, 10 долларов США) или после (например, 10 ₫, который является вьетнамским доном).

Но как цифры отформатированы, зависит от пользователей, а не от валюты.

E.g.

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) locale для формата и валюты, чтобы вы получили вещи, например, $ 1,123.56 - правильное использование и. но неправильный символ.

Double vietnamTotal = 1234.56; 
CultureInfo ci = new CultureInfo(1066); // Vietnam 
return vietnameTotal.ToString("c",ci)); 

Дал бы 1.234,56 ₫ - Правильный символ, неправильное использование и. для текущего пользователя.

Это сообщение gives more detail о том, что нужно делать, но не как это сделать.

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

ответ

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

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

+0

Почти Джон, спасибо, - однако он не получает позицию символа валюты правильной (например, во Вьетнаме или в Испании поместить символ валюты после значения) Можно утверждать, что позиция зависит от культуры пользователей (например, decimal separato r), но такие продукты, как Excel и SharePoint, занимают позицию, основанную на культуре валюты. – Ryan

+0

Хорошо, исправление этого ... –

+0

Готово - вы можете посмотреть другие свойства, связанные с валютой, хотя похоже, что вы не хотите изменять размер или символы группировки. –

1

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

Я предполагаю, что я путаюсь двумя противоречивыми заявлениями ... «Валюта в вопросе будет иметь свои собственные правила» и «как числа отформатированные зависит от локальных пользователей [так в оригинале], не валюта."

Если все, что вы хотите изменить это символ валюты, и оставить форматирование, как в текущей культуре, не клонировать НИЛ и установка символа достаточно?

 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); 
+0

Извините ... кажется, этот промах был слишком велик для комментария. –

+0

Это именно то, что предложил Джон в своем ответе. – Ryan

+0

И если вы пришли на сайт, чтобы увидеть цену на что-то в Franch, вы бы хотели увидеть € 1,234,56 (символ евро, форматирование в США/Великобритании) или € 1.234,56 (символ евро и французское форматирование). – Ryan

0

Для работы с текстовое поле, выполните следующие действия:.

textBox2.Text = "Rp" + (textBox1.Text = string.Format(System.Globalization.CultureInfo.GetCultureInfo("id-ID"), "{0:#,##0.00}", double.Parse(textBox1.Text))); 
Смежные вопросы