我有一个收费金额表和货币代码(美元,日元,加元,欧元等),我正在寻找正确格式化货币的最简单方法。使用我的本地文化代码(USA)并获取我的decimal.ToString(“c”)得到$ 0.00输出,但我想根据代码得到正确的货币符号和小数位数。
是否存在任何库?我当然可以为每个语句编写一个switch语句和自定义规则,但我认为这必须在以前完成。
更新
我修改了Jon B的示例代码如下
static IDictionary<string, string> GetCurrencyFormatStrings()
{
var result = new Dictionary<string, string>();
foreach (var ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
try
{
var ri = new RegionInfo(ci.Name);
result[ri.ISOCurrencySymbol] =
string.Format("{0}#,#0.{1};({0}#,#0.{1})",
ri.CurrencySymbol,
new string('0',
i.NumberFormat.CurrencyDecimalDigits));
}
catch { }
}
return result;
}
这允许我简单地去Amount.ToString(Currency [“JPY”]),格式将在我的本地上下文中输出逗号分隔符,但自动输入正确的货币符号和小数位。
让我知道是否有人有更清洁的方法,或者我很快就会将Jon的答案标记为正确。
答案 0 :(得分:22)
public static class DecimalExtension
{
private static readonly Dictionary<string, CultureInfo> ISOCurrenciesToACultureMap =
CultureInfo.GetCultures(CultureTypes.SpecificCultures)
.Select(c => new {c, new RegionInfo(c.LCID).ISOCurrencySymbol})
.GroupBy(x => x.ISOCurrencySymbol)
.ToDictionary(g => g.Key, g => g.First().c, StringComparer.OrdinalIgnoreCase);
public static string FormatCurrency(this decimal amount, string currencyCode)
{
CultureInfo culture;
if (ISOCurrenciesToACultureMap.TryGetValue(currencyCode, out culture))
return string.Format(culture, "{0:C}", amount);
return amount.ToString("0.00");
}
}
以下是为几种不同的货币代码调用FormatCurrency的结果:
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
答案 1 :(得分:5)
应该通过传递CultureInfo
:
CultureInfo ci = new CultureInfo("en-GB");
amount.ToString("C", ci);
答案 2 :(得分:2)
您可以构建一个字典,从ISO货币符号(USD)到货币符号($):
static void Main(string[] args)
{
var symbols = GetCurrencySymbols();
Console.WriteLine("{0}{1:0.00}", symbols["USD"], 1.5M);
Console.WriteLine("{0}{1:0.00}", symbols["JPY"], 1.5M);
Console.ReadLine();
}
static IDictionary<string, string> GetCurrencySymbols()
{
var result = new Dictionary<string, string>();
foreach (var ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
try
{
var ri = new RegionInfo(ci.Name);
result[ri.ISOCurrencySymbol] = ri.CurrencySymbol;
}
catch { }
}
return result;
}
这是基本的想法,你需要调整它以满足你的需求。
请注意,您当然可以使用CultureInfo
类转换为特定文化的字符串,但正如Alexei的评论中所述,这将导致每个字符串略有不同(如1.00 vs 1,00 )。无论您使用哪种,都取决于您的需求。