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

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

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

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

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

В этом сообщении содержится более подробная информация О том, что нужно делать, а не о том, как это сделать.

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


person Ryan    schedule 01.07.2009    source источник


Ответы (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));
    }
}

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

person Jon Skeet    schedule 01.07.2009
comment
Почти Джон, спасибо - однако он не дает правильного положения символа валюты (например, Вьетнам или Испания помещают символ валюты после значения). Вы можете возразить, что позиция зависит от культуры пользователя (например, десятичный разделитель), но такие продукты, как Excel и SharePoint, определяют позицию на основе культуры валюты. - person Ryan; 02.07.2009
comment
Готово - вы можете посмотреть другие свойства, связанные с валютой, хотя похоже, что вы не хотите изменять размер группировки или символы. - person Jon Skeet; 02.07.2009
comment
Что ж, я буду ... Думал, ты мог бы быть там! Я часами искал, где это было спрятано. Валюта *** Образец а? - person Ryan; 02.07.2009
comment
Я не уверен, что понимаю, почему вы меняете шаблоны. Конечно, достаточно взять текущую информацию о номере культуры (или ее клон) и установить символ валюты? - person Black Light; 11.11.2011
comment
@RossWatson: Как я уже упоминал в своем ответе, если вы хотите, чтобы учитывалась позиция символа валюты, вам необходимо скопировать шаблон. В некоторых случаях вы можете захотеть это сделать, а в некоторых - нет. Обратите внимание, что я не устанавливаю весь NumberFormatInfo в новый формат; только то, что мне нужно. В частности, согласно вопросу мы не хотим изменять десятичные разделители / разделители группировки. - person Jon Skeet; 11.11.2011
comment
Привет, Джон, почему ты клонируешь NumberFormat? Это не кажется необходимым? Ваше здоровье - person fearofawhackplanet; 12.07.2016
comment
@fearofawhackplanet: это гарантирует, что он изменчив. Возможно, тот, который возвращается конструктором, также является изменяемым, но я не уверен - кажется, что проще всего клонировать, а это означает, что ответ будет работать в тех случаях, когда культура не изменяемый (или будет использоваться где-то еще). - person Jon Skeet; 12.07.2016

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

Думаю, меня смущают два противоречащих друг другу утверждения ... «У рассматриваемой валюты будут свои правила» и «форматирование чисел зависит от локальных пользователей [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);
person Black Light    schedule 11.11.2011
comment
Извините ... похоже, эта прогулка была слишком большой для комментария. - person Black Light; 11.11.2011
comment
Именно это и предложил Джон в своем ответе. - person Ryan; 15.11.2011
comment
Кстати, если ВЫ зашли на веб-сайт, чтобы увидеть цену на что-то на французском языке, вы бы захотели увидеть 1234,56 евро (символ евро, форматирование для США / Великобритании) или 1,234,56 евро (символ евро и французское форматирование). - person Ryan; 15.11.2011
comment
›Именно это и предложил Джон в своем ответе. Не совсем. Однако, если бы я использовал машину с британской культурой, я бы хотел, чтобы веб-сайт показывал мне цену в евро и долларах как 1234,56 евро и 1234,56 доллара. Если бы я использовал французскую культуру, я бы, вероятно, хотел, чтобы на сайте было показано 1 234,57 € и 1 234,57 $. - person Black Light; 15.11.2011

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

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