基于指定区域文化与货币ISO代码格式化货币数值的.NET实现需求
.NET 实现指定区域文化与货币的数值格式化
需求概述
需要根据指定的区域文化(Culture)和货币ISO代码格式化decimal数值,要求货币符号的样式、位置,以及数字的千分位、小数点格式完全匹配对应区域的习惯,具体示例如下:
原始数值:123456.79m
| 区域文化 | 货币ISO | 预期格式化结果 |
|---|---|---|
en-US | USD | $123,456.79 |
en-US | EUR | €123,456.79 |
en-US | HUF | HUF 123,456.79 |
de-DE | USD | 123.456,79 $ |
de-DE | EUR | 123.456,79 € |
de-DE | HUF | 123.456,79 HUF |
hu-HU | USD | 123 456,79 USD |
hu-HU | EUR | 123 456,79 EUR |
hu-HU | HUF | 123 456,79 Ft |
类比JavaScript中成熟的实现方式:
new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(123456.79);
实现方案
.NET Core 3.0+ / .NET 5+
较新版本的.NET提供了直接设置货币代码的API,无需手动调整符号和格式位置,只需基于目标区域文化克隆格式信息并指定货币即可:
decimal amount = 123456.79m; string targetCulture = "de-DE"; string currencyCode = "EUR"; // 创建目标区域的文化实例 var culture = new CultureInfo(targetCulture); // 克隆格式信息避免修改原文化对象 var numberFormat = (NumberFormatInfo)culture.NumberFormat.Clone(); // 设置货币ISO代码,自动匹配对应符号和区域格式规则 numberFormat.Currency = currencyCode; // 使用货币格式符"C"格式化数值 string result = amount.ToString("C", numberFormat); // 输出:123.456,79 €
.NET Framework
.NET Framework中没有直接设置Currency属性的方法,需要手动配置货币符号和符号位置(通过CurrencyPositivePattern),可以结合自定义映射来适配不同货币:
decimal amount = 123456.79m; string targetCulture = "hu-HU"; string currencyCode = "USD"; var culture = new CultureInfo(targetCulture); var numberFormat = (NumberFormatInfo)culture.NumberFormat.Clone(); // 根据货币代码配置符号和位置 switch (currencyCode) { case "USD": numberFormat.CurrencySymbol = "USD"; numberFormat.CurrencyPositivePattern = 3; // 数值后接货币符号 break; case "EUR": numberFormat.CurrencySymbol = "EUR"; numberFormat.CurrencyPositivePattern = 3; break; case "HUF": numberFormat.CurrencySymbol = "Ft"; numberFormat.CurrencyPositivePattern = 3; break; } string result = amount.ToString("C", numberFormat); // 输出:123 456,79 USD
如果需要更通用的适配,可以通过遍历所有区域文化,找到对应货币代码的格式规则,或者使用第三方库补充.NET Framework的API不足。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

