为啥 C# decimal ToString 不请求文化和货币?

Posted

技术标签:

【中文标题】为啥 C# decimal ToString 不请求文化和货币?【英文标题】:Why won't C# decimal ToString request culture AND currency?为什么 C# decimal ToString 不请求文化和货币? 【发布时间】:2018-12-13 11:31:23 【问题描述】:

在给定数字和货币的情况下,我找不到将它们打印到给定文化的字符串的选项。我找到的最接近的东西是decimal.ToString("C", GIVEN_CULTURE),但这不会要求货币,并且会假设我在谈论文化所知道的货币。如果我在欧洲使用美元怎么办?

例如,javascript 在构建字符串时会同时请求这两个参数:

GIVEN_STRING.toLocaleString(culture,  style: 'currency', currency: currency )

这是相关的,因为我正在开发的软件同时处理美元和 MXN(墨西哥比索)。我们的网络仪表板显示不同的文化符号(Chrome 示例,我认为跨浏览器会有所不同):

zh:

USD 的符号为“$” MXN 有符号“MX$”

es-MX:

USD 的符号为“US$” MXN 有符号“$”

【问题讨论】:

你有文化里面的货币信息 -> CultureInfo.NumberFormat.Currency 是的,但就我而言,在欧洲的货币是欧元。我想显示美元,但我知道我要打印的金额是美元。如果我依赖你提到的属性,它会打印 €! CurrencySymbol 属性有一个setter,你可以随意设置。 但是我会使用文化的其他方面,如 CurrencyDecimalDigits 或 CurrencyDecimalSeparator “错误”,这意味着我将显示美元,就好像它们是欧元一样,除了符号 显示外币时,我会使用dm.ToString("N2", localCulture),然后附加(或前置)ISO 货币代码,例如"USD""MXN"。我认为许多文化都没有关于如何显示其他国家货币的惯例。 【参考方案1】:

如果您只关心货币符号,您可以轻松地将其设置为您喜欢的任何内容:

var format = (NumberFormatInfo)CultureInfo.CreateSpecificCulture("es-MX").NumberFormat.Clone();
format.CurrencySymbol = "US$";
decimal amount = 12.34m;
amount.ToString("C", format);
// OUTPUT:
// US$12.34

但通常还有更多的格式化货币价值。如您所见,由于特定的文化差异(如小数点、货币符号位置、间距等),该值在德国的格式会非常不同:

amount.ToString("C", CultureInfo.CreateSpecificCulture("de-DE"));
// OUTPUT:
// 12,34 €

【讨论】:

【参考方案2】:

我不确定我是否理解您的问题,但例如,如果您希望将 double 表示为不同国家/地区的货币,那么您需要为其提供不同的 CultureInfo

double foo = 3;
string fooGerman = foo.ToString("C", CultureInfo.GetCultureInfo("de-DE"));
string fooEnglish = foo.ToString("C", CultureInfo.GetCultureInfo("en-GB"));
Console.WriteLine(fooGerman);
Console.WriteLine(fooEnglish);

OUTPUT
3,00 €
£3.00

如果这还不够,您可以在CultureInfo.NumberFormat.CurrencySymbol 中为给定的CultureInfo 设置符号,您可以为ToString() 创建自己的IFormatProvider 或创建自己的CultureInfo

【讨论】:

我的问题可以简化为“C# CultureInfo 理解外币吗?”。我想答案是否定的。如果上一个问题的答案是否定的,您的回答解决了我的问题。谢谢! CultureInfo 不了解外币,但 Javascript 也不了解,您指定的货币与文化无关。想一想对于每种文化将如何实施,以了解其他文化如何表达货币。获得您需要的包含如何表达该货币的文化是非常有效的。

以上是关于为啥 C# decimal ToString 不请求文化和货币?的主要内容,如果未能解决你的问题,请参考以下文章

C#中decimal.Parse(t70OnlinePrice.Value)保留两位小数

C#科学计数字符串,如“7.1e-003”转换为decimal类型数据

c#十进制toString()用逗号(,)转换

C# Math.Ceiling函数为啥返回值是decimal形式而不是int形式呢?

为啥 Decimal.Divide(int, int) 有效,但 (int / int) 无效?

C# Decimal.parse的问题。有字符串 3.10 如何转换成decimal时不会变成3.1。我需要的是完整的3.10