2016-05-23 13 views
1

я обычно просто использовать это:валют Формат 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"))); 

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

+0

Похоже нет "легко" способ сделать это. Начиная с http://stackoverflow.com/a/22837610/1336590, вы можете захотеть иметь 'cultureInfo' в качестве входного параметра метода. Тогда у меня будет 'string currencyValue = value.ToString (" C ", cultureInfo);' для получения "правильной" строки валюты. Затем удалите символ валюты, обрезайте и добавьте 'ISOCurrencySymbol'' regionInfo'. --- Кстати. используйте 'decimal' вместо' double' для денежных значений, чтобы избежать головных болей. – Corak

+0

Это решение тысячи разделителей, спасибо за это предложение! –

+0

Итак, в основном: 'public static string FormatCurrency (десятичное значение, CultureInfo cultureInfo) {return string.Concat (новый RegionInfo (cultureInfo.LCID) .ISOCurrencySymbol," ", value.ToString (" C ", cultureInfo) .Replace (cultureInfo. NumberFormat.CurrencySymbol, string.Empty) .Trim()); } '--- и протестирован с помощью параметра FormatCurrency (1234.5678m, CultureInfo.GetCultureInfo ("en-CA")) 'и' FormatCurrency (1234.5678m, CultureInfo.GetCultureInfo ("de-DE")) ' – Corak

ответ

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 вы убедитесь, символ помещается перед номером с дополнительным пустого пространства (см также documentation for CurrencyPositivePattern) CurrencyNegativePattern = 12 делает то же самое для отрицательных значений (documentation for CurrencyNegativePattern).

выход:

CAD 1,234.57

и отрицательного

CAD -1,234.57

+0

Да, намного лучше, чем манипуляции с строкой. – Corak

0

, как @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, "")); 
+1

Это не удастся для культур, где символ валюты не является (непосредственно) перед значением. Попробуйте это с помощью '' de-DE ''например. – Corak

+0

Правда, нужно было бы выполнить '.Replace (cai.CurrencySymbol," ")' вместо '.Substring (1)'. Спасибо за это хорошее предложение! –