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

Why won't C# decimal ToString request culture AND currency?

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

Javascript,例如,在构建字符串时将请求两个参数:

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

这很重要,因为我正在开发的软件可以处理 USD 和 MXN(墨西哥比索)。我们的网络仪表板显示有关文化的不同符号(Chrome 示例,我认为它因浏览器而异):

zh:

es-MX:

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

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

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

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

我不确定我是否理解你的问题,但是例如,如果你想将 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 或创建您自己的 IFormatProvider拥有 CultureInfo.