如何获得特定的文化货币模式
我如何获得特定文化的货币模式?
例如:
而不是使用:
string.Format("{0:c}", 345.10)
我想用这个:
string.Format("#.##0,00 €;-#.##0,00 €", 345.10);
但是我如何为我的应用程序需要的每种文化获得模式字符串(如“#。## 0,00€; – #。## 0,00€”)?
我不能使用“{0:c}”模式,因为如果用户切换语言,则货币应该相同。
CultureInfo
包含NumberFormatInfo
,此类描述(除其他外)如何格式化该特定文化的货币。
特别是,您可以使用CurrencyPositivePattern
和CurrencyNegativePattern
来确定货币符号是在金额之前还是之后,当然还有CurrencySymbol
以获得正确的货币符号。 当使用C
格式说明符时,.NET将使用所有这些信息。
您可以在MSDN上阅读有关NumberFormatInfo类的更多信息。
下面的代码演示了正确格式化货币所需的一些步骤。 它只使用CurrencySymbol
, CurrencyPositivePattern
和CurrencyDecimalDigits
,因此不完整:
var amount = 123.45M; var cultureInfo = CultureInfo.GetCultureInfo("da-DK"); var numberFormat = cultureInfo.NumberFormat; String formattedAmount = null; if (amount >= Decimal.Zero) { String pattern = null; switch (numberFormat.CurrencyPositivePattern) { case 0: pattern = "{0}{1:N" + numberFormat.CurrencyDecimalDigits + "}"; break; case 1: pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "}{0}"; break; case 2: pattern = "{0} {1:N" + numberFormat.CurrencyDecimalDigits + "}"; break; case 3: pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "} {0}"; break; } formattedAmount = String.Format(cultureInfo, pattern, numberFormat.CurrencySymbol, amount); } else { // ... } Console.WriteLine(formattedAmount);
当然你可以简单地使用:
var amount = 123.45M; var cultureInfo = CultureInfo.GetCultureInfo("da-DK"); var formattedAmount = String.Format(cultureInfo, "{0:C}", amount); Console.WriteLine(formattedAmount);
我想你要问的是如何更改货币符号但保留特定于文化的格式。 您可以通过获取当前NumberFormatInfo
的副本并修改CurrencySymbol
属性来执行此操作:
Thread.CurrentThread.CurrentCulture = new CultureInfo("de"); // pretend we are german var nfi = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone(); nfi.CurrencySymbol = "$$$"; Console.WriteLine(string.Format(nfi,"{0:c}",345.10));
这将输出:
345,10 $$$
不改变CurrentCulture
它输出(对我来说):
$$$345.10
适用于所有数字格式的快速而肮脏的方法是:
var culture = CultureInfo.GetCultureInfo("el-GR"); var numberFormat = (NumberFormatInfo)culture.NumberFormat.Clone(); numberFormat.CurrencySymbol = "€"; // Force the currency symbol regardless of culture var specifier = "C"; // Or any other format specifier var positivePattern = 1110.ToString(specifier, numberFormat).Replace('1', '#'); var negativePattern = (-1110).ToString(specifier, numberFormat).Replace('1', '#'); var pattern = positivePattern + ";" + negativePattern;
在这种情况下,模式等于“#。## 0,00€; – #。## 0,00€”。 这避免了许多令人头疼的问题,试图弄清楚所有的排列。 我很欣赏被问到的问题,因为它帮助了我,并迫使我找到一个更简单的答案。
你尝试过使用string.Format("{0:N2} €", 345.10)
吗? 这应格式化为用户区域中的2个小数位,后跟空格和欧元符号。
下面的测试说明了如何实现这一目标:
[Test] public void DisplayEurosInGreeceAndEngland() { var val = 125.22m; Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = new CultureInfo("el-GR"); Console.WriteLine(string.Format("{0:n} €", val)); Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB"); Console.WriteLine(string.Format("{0:n} €", val)); }
通过使用当前所选文化中的标准十进制表示法,您可以显示跳过货币的任何给定值,您可以单独处理该货币。
您需要使用以下格式设置货币/双倍格式:
money.ToString("C", culture);
困难的部分实际上是基于ISO代码获得正确的文化。 我不知道你如何跟踪你需要的文化。 请记住,这只是您的资金格式 ,而不是转换为不同的货币/文化!
更多详情:
ISOCurrencySymbol是RegionInfo的一部分,您可以根据CultureInfo创建,您可以从当前线程的文化设置中检索。 您应该创建一个实现字典的单例,以便从ISOCurrencyCode转换为CultureInfo。
上述就是C#学习教程:如何获得特定的文化货币模式分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1013038.html