2013-11-17 3 views
1

Я много искал здесь и на других сайтах, но я не нашел точное решение, которое я ищу.String.Format валюты дробная часть

Я хочу вывести цену, основанную на текущей культуре. Я выполнил следующие тесты:

decimal price = 909865747.98M; 
decimal price2 = 90986574798M; 

string frFR = string.Format(new System.Globalization.CultureInfo("fr-FR"), "{0:C}", price); 
string frFR2 = string.Format(new System.Globalization.CultureInfo("fr-FR"), "{0:C}", price2); 
string co = string.Format(new System.Globalization.CultureInfo("es-CO"), "{0:C}", price); 
string co2 = string.Format(new System.Globalization.CultureInfo("es-CO"), "{0:C}", price2); 

и я получил следующие результаты

frFR: 909 865 747,98 € 
frFR2: 90 986 574 798,00 € 
co: $909.865.747,98 
co2: $90.986.574.798,00 

Я хотел бы, чтобы не получить дробную часть, если десятичное число фактически является целым числом. Но я хочу сохранить десятичный specarator, предоставленный культурой

Любая идея?

Спасибо заранее.

ответ

1

попытка использования (custom numeric formats) В вашем случае это будет:

string frFR = string.Format(new System.Globalization.CultureInfo("fr-FR"), 
      (new CultureInfo("fr-FR")).NumberFormat.CurrencyPositivePattern % 2 == 0 ? 
        "{0}{1:#,##0.##}" : "{1:#,##0.##}{0}", 
      new RegionInfo(new CultureInfo("fr-FR").LCID).CurrencySymbol, price); 
string frFR2 = string.Format(new System.Globalization.CultureInfo("fr-FR"), 
      (new CultureInfo("fr-FR")).NumberFormat.CurrencyPositivePattern % 2 == 0 ? 
        "{0}{1:#,##0.##}" : "{1:#,##0.##}{0}", 
      new RegionInfo(new CultureInfo("fr-FR").LCID).CurrencySymbol, price2); 

string co = string.Format(new System.Globalization.CultureInfo("es-CO"), 
      (new CultureInfo("es-CO")).NumberFormat.CurrencyPositivePattern % 2 == 0 ? 
        "{0}{1:#,##0.##}" : "{1:#,##0.##}{0}", 
      new RegionInfo(new CultureInfo("es-CO").LCID).CurrencySymbol, price); 
string co2 = string.Format(new System.Globalization.CultureInfo("es-CO"), 
      (new CultureInfo("es-CO")).NumberFormat.CurrencyPositivePattern % 2 == 0 ? 
        "{0}{1:#,##0.##}" : "{1:#,##0.##}{0}", 
      new RegionInfo(new CultureInfo("es-CO").LCID).CurrencySymbol, price2); 

Использование ISOCurrencySymbol вместо CurrencySymbol, если вы хотите, стандартный код валюты ISO вместо символа.

Вот способ сделать это

public static string FormatCurrency(decimal amount, string culture, 
     bool useIsoCurrencySymbol = false) 
{ 
    var ci = new CultureInfo(culture); 
    return string.Format ci, 
     ci.NumberFormat.CurrencyPositivePattern % 2 == 0 ? 
      "{0}{1:#,##0.##}" : "{1:#,##0.##}{0}", 
     useIsoCurrencySymbol? 
      new RegionInfo(ci.LCID).ISOCurrencySymbol: 
      new RegionInfo(ci.LCID).CurrencySymbol, amount); 
} 

Примечание: разделитель тысяч для «FR-FR», по-видимому, на самом деле пространство, а не период или запятой.

+0

Nice, но это не форматировать строку в качестве валюты ~~ – MichaC

+0

я добавил текущей валюты культуры символ –

+0

Благодарю. Но это не делает;) Действительно, валюта иногда находится в начале цены, а иногда и в конце ... По стране. И с этим форматированием, вы не переопределите десятичный разделитель? – Crashouille

1

Проверьте, если ваш десятичного фактически является целым числом, или если он имеет цифры, делая простую проверку decimalvalue % 1 == 0

А если это целое число, просто использовать строку форматирования без цифр: {0:C0}

string formatPrice = price % 1 == 0 ? "{0:C0}" : "{0:C}"; 
string formatPrice2 = price2 % 1 == 0 ? "{0:C0}" : "{0:C}"; 

string frFR = string.Format(new System.Globalization.CultureInfo("fr-FR"), formatPrice, price); 
string frFR2 = string.Format(new System.Globalization.CultureInfo("fr-FR"), formatPrice2, price2); 
+0

Это может быть решением, но вроде overkill, чтобы сделать это на каждом ценовом выходе ... – Crashouille

+1

просто напишите себе вспомогательную функцию, которая это делает? – MichaC

0

Вы можете сделать это следующим образом:

System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("fr-FR"); 
List<decimal> lst = new List<decimal>() 
{ 
    909865747.98M, 
    90986574798M 
}; 

List<string> results = new List<string>(); 

foreach(decimal d in lst) 
{ 
    if(d.Equals(decimal.Truncate(d))) 
     results.Add(d.ToString("C0",ci)); 
    else 
     results.Add(d.ToString("C",ci)); 
} 

Или, если вместо этого вы хотите, чтобы словарь, содержащий ваш желательный культурный объект obje каратов, после List<decimal> заменить это:

Dictionary<CultureInfo, List<string>> results = new Dictionary<CultureInfo, List<string>>() 
{ 
    {new System.Globalization.CultureInfo("fr-FR"),new List<string>()}, 
    {new System.Globalization.CultureInfo("es-CO"),new List<string>()} 
}; 

foreach(decimal d in lst) 
{ 
     if (d.Equals(decimal.Truncate(d))) 
     { 
      foreach (var item in results) 
      { 
       item.Value.Add(d.ToString("C0", item.Key)); 
      } 
     } 
     else 
     { 
      foreach (var item in results) 
      { 
       item.Value.Add(d.ToString("C", item.Key)); 
      } 
     } 
} 

Если для одного лайнера:

System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("fr-FR"); 
string frFR2 = price2.Equals(decimal.Truncate(price2)) ? price2.ToString("C0",ci) : price2.ToString("C",ci); 
string frFR = price.Equals(decimal.Truncate(price)) ? price.ToString("C0",ci) : price.ToString("C",ci); 
Смежные вопросы