Формат валюты C# ISOCurrencySymbol

Я обычно просто использовал бы это:

double test = 1234.5678;
Console.WriteLine(test.ToString("C"));

который прекрасно работает У меня была перезапись канадских долларов, чтобы люди увидели разницу между долларами США и Канады:

var canadaFi = (NumberFormatInfo)CultureInfo.GetCultureInfo("en-CA").NumberFormat.Clone();
canadaFi.CurrencySymbol = "C$ ";
Console.WriteLine(val.ToString("C", canadaFi));

Но теперь люди просят вывод, как:

CAD 1234,56

Поэтому я использовал:

RegionInfo ca = new RegionInfo("en-CA");
Console.WriteLine(string.Format("{0} {1}", ca.ISOCurrencySymbol, test.ToString("f2")));

это работает, но мне интересно, если это лучший подход, чтобы получить символ валюты 3 char iso перед float/double. Таким образом, вместо использования CultureInfo Я должен использовать RegionInfo сейчас?

2 ответа

Решение

Правильный путь будет:

const string canada = "en-CA";

var ca = new RegionInfo(canada);
var cai = new CultureInfo(canada)
{
    NumberFormat =
    {
        CurrencySymbol = ca.ISOCurrencySymbol,
        CurrencyPositivePattern = 2,
        CurrencyNegativePattern = 12
    }
};

Console.WriteLine(test.ToString("C", cai));

Если вы установите CurrencyPositivePattern = 2 убедитесь, что символ помещен перед числом с дополнительным пустым пробелом (см. также документацию для CurrencyPositivePattern), CurrencyNegativePattern = 12 делает то же самое для отрицательных значений ( документация для CurrencyNegativePattern).

выход:

CAD 1 234,57

и для негатива

CAD -1 234,57

Как объясняет @Corak:

CultureInfo cai = new CultureInfo("en-CA");
RegionInfo ca = new RegionInfo("en-CA");
Console.WriteLine(ca.ISOCurrencySymbol + " " + test.ToString("C", cai).Substring(1));

выход:

CAD 1 234,57

Добавлено предложение @Coraks:

Console.WriteLine(ca.ISOCurrencySymbol + " " + test.ToString("C", cai).Replace(cai.CurrencySymbol, ""));
Другие вопросы по тегам