2016-03-15 109 views
2

我有一个函数:自定义货币格式

string FormatCurrency(string currencyCode, decimal amount) 

例子:

Input: "USD", 1230.56 
Output: "USD 1,230.56" 

Input: "USD", 1230.00 
Output: "USD 1,230" 

Input: "VND", 1200000 
Output: "1.200.000 VND" 

我想参加文化格式(与代码,而不是符号)和自定义格式(“#,# ###“)。 我该如何执行? 感谢

我的代码,我在网上看到:

CultureInfo 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("#,##.##"); 
} 

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

,但输出为 “1,200.00 $”。我预期的结果是“USD 1200”

+0

你能请把你的代码,你h ave试过这个.. – SarangK

+0

我刚更新了,请检查! ^^ – Danie

回答

3

一个有点hackish,但你可以这样做:

CultureInfo 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) 
{ 
    // fall back to current culture if none is found 
    // you could throw an exception here if that's not supposed to happen 
    culture = CultureInfo.CurrentCulture;    
} 
culture = (CultureInfo)culture.Clone(); 
culture.NumberFormat.CurrencySymbol = currencyCode; 

// Add spaces between the figure and the currency code 
culture.NumberFormat.CurrencyPositivePattern = culture.NumberFormat.CurrencyPositivePattern == 0 ? 2 : 3; 
var cnp = culture.NumberFormat.CurrencyNegativePattern; 
switch(cnp) 
{ 
    case 0: cnp = 14; break; 
    case 1: cnp = 9; break; 
    case 2: cnp = 12; break; 
    case 3: cnp = 11; break; 
    case 4: cnp = 15; break; 
    case 5: cnp = 8; break; 
    case 6: cnp = 13; break; 
    case 7: cnp = 10; break; 
} 
culture.NumberFormat.CurrencyNegativePattern = cnp; 

return amount.ToString("C" + ((amount % 1) == 0?"0":"2"), culture);  

小提琴这里:https://dotnetfiddle.net/30f7u3

为:

FormatCurrency("USD", 1230.56M); 
FormatCurrency("USD", 1230.00M); 
FormatCurrency("VND", 1200000M); 

我得到:

USD 1,230.56 
USD 1,230 
1.200.000 VND 
+0

您没有检查是否没有文化发现哪个会引发错误。对于否定模式来说,检查它是否为0或1是不够的,对于否定模式有16个案例。 – Caesar

+0

@Caesar说的没错,我加了这个问题的评论:-)是的,应该为负面模式做一个更好的检查案例,你确实是对的 – Jcl

+0

@Caesar那里,修正:-) – Jcl

0

有点难看,但财产以后这样可能会工作,除非你决定使用培养中使用货币格式,文化和货币格式

var output = String.Format ("{0} {1:### ### ##0.00}",currencyCode,amount) 

var output = amount.ToString ("C"); 
1

我希望这会帮助你。如果我理解正确,你想把所有东西都显示为当前的文化,只是你想改变货币的显示方式。

这是基础知识,你可以自己继续。

 CultureInfo culture = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
     culture.NumberFormat.CurrencySymbol = currencyCode; 
     culture.NumberFormat.CurrencyPositivePattern = 2; 

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

结果对我来说是42,55美元。

+0

你的问题有点令人困惑,删除了小数点分隔符的变化,他没有提出这个要求,而在编写货币时,当你期望看到另一个货币时,它会令人困惑。还需要添加如何不打印小数点,如果他们是零 –

+0

这适用于'美元'和小数。对于'VND',它会在数字前打印'VND',你也需要考虑这个。 – Jcl

+0

(此外,这将只打印根据当前文化的小数分隔符,而不是由货币代码指定的文化) – Jcl