Как отформатировать денежное значение из ISOCurrencySymbol в C # - PullRequest
1 голос
/ 21 апреля 2010

Я создал класс Money, чтобы сохранять денежные значения в разных валютах. Класс использует трехбуквенные символы ISO для хранения типов валюты:

public class Money
{
    public decimal Amount { get; set; }
    public string Currency { get; set; }
}

Есть ли в C # способ использовать эту информацию, скажем, 100,00 долларов США, и отформатировать ее как "100,00 долларов США"? Единственный способ, о котором я знаю, требует CultureInfo, например:

Amount.ToString("C", CultureInfo.CreateSpecificCulture("en-US"));

Однако это не работает с моим классом Money. Есть ли другое решение? Я открыт для того, чтобы изменить свой класс денег.

Я искал на этом сайте похожие вопросы (например, this ), но не смог найти ответ на поставленный выше вопрос.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2010

Это нетривиальная проблема локализации у вас там. Посмотрите на эти примеры из MSDN :

123.456 ("C", en-US) -> $123.46
123.456 ("C", fr-FR) -> 123,46 €
123.456 ("C", ja-JP) -> ¥123

Как бы вы показали USD 123.456 кому-то во Франции? $123.46 или 123,46 $?

Я бы, вероятно, остановился на его отображении с использованием трехбуквенного символа ISO, хотя положение этого символа, по-видимому, также различается в разных странах. Из инструкции по использованию символа EUR :

В текстах на английском языке за кодом ISO «EUR» следует фиксированный пробел и сумма:

a sum of EUR 30

NB. То же правило применяется на ирландском, латышском и мальтийском языках. На всех других официальных языках ЕС порядок обратный; за суммой следует фиксированный пробел и код ISO «EUR» (или знак евро на графике):

une somme de 30 EUR
0 голосов
/ 20 февраля 2016

Проверьте этот метод расширения:

public static string FormatCurrency(this decimal amount, string currencyCode)
{
    var culture = (from c in CultureInfo.GetCultures(CultureTypes.SpecificCultures)
            let r = new RegionInfo(c.LCID)
            where r != null
            && r.ISOCurrencySymbol.ToUpper() == currencyCode.ToUpper()
            select c).FirstOrDefault();

    if (culture == null)
        return amount.ToString("0.00");

    return string.Format(culture, "{0:C}", amount);
}

Использование:

decimal amount = 100;

amount.FormatCurrency("AUD");  //$100.00
amount.FormatCurrency("GBP");  //£100.00
amount.FormatCurrency("EUR");  //100,00 €
amount.FormatCurrency("VND");  //100,00 ₫
amount.FormatCurrency("IRN");  //₹ 100.00

Этот код от: http://lukencode.com/2012/05/28/quick-and-dirty-csharp-currency-helper/

...