2010-04-21 24 views
1

我已创建Money类以便以不同货币存储货币值。类使用3个字母的ISO符号来存储货币类型:如何从C#中的ISOCurrencySymbol格式化货币值#

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),但找不到回答上述问题的问题。

+0

你能详细说明你的意思是“这不适用于我的Money课程”吗? – Amry 2010-04-21 02:21:10

+0

仅仅因为Money类不存储CultureInfo,它仅存储该货币的ISO符号。 – Naresh 2010-04-21 12:34:09

回答

2

这是一个非平凡的本地化问题,你在那里。看看这些例子from 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.46123,46 $

我可能坚持使用3字母的ISO符号来显示它,虽然这个符号的位置在不同的国家也有所不同。从usage guidelines for the EUR symbol

在英文文本中,ISO代码“欧元”后跟一个固定的空间和金额:

a sum of EUR 30

注:该规则同样适用于爱尔兰,拉脱维亚和马耳他。在所有其他欧盟官方语言中,订单都是相反的;量之后是固定空间和ISO代码 'EUR'(或图形对欧元符号):

une somme de 30 EUR
+0

嗯...,我明白你在说什么。我希望至少有一种方法可以为给定的当地货币格式化所有货币。例如,如果以en-US语言环境运行,USD将显示为$ 100.00,日元显示为¥123。 – Naresh 2010-04-21 12:38:36

0

检查此扩展方法:

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/