3

我正在使用.ToString("C")方法以货币格式显示十进制数。但结果看起来像"US$5,365.20"而不是"$5,365.20"。我试过用.ToString("C", new CultureInfo("en-US")),结果一样。但是当我尝试使用另一种文化(例如,en-GB)时,一切都很好(1,234.56 英镑)。

那么,为什么“US”出现在“$”符号之前呢?我怎样才能删除它?

UPD我很抱歉。再次检查了一下,我发现,new CultureInfo("en-US"))所有工作都完美无缺,我查看了另一个标签 :) 但现在我看到(感谢@Mike McCaughan),当前的货币符号是“美元”。当前的文化名称是“en-US”。

4

3 回答 3

6

“US”出现在“$”之前,因为有人使用控制面板中的区域小程序自定义了货币符号。要获取默认货币符号,请使用CultureInfo.GetCultureInfo而不是构造函数

decimal amount = 5365.20M;
Console.WriteLine(amount.ToString("C"));                                      // US$5,365.20
Console.WriteLine(amount.ToString("C", new CultureInfo("en-US")));            // US$5,365.20
Console.WriteLine(amount.ToString("C", CultureInfo.GetCultureInfo("en-US"))); // $5,365.20

MSDN 库文档解释了差异。对于构造函数:

用户可能会选择通过控制面板的区域和语言选项部分覆盖与当前 Windows 文化相关的一些值。...如果与name关联的区域性标识符与当前 Windows 区域性的区域性标识符匹配,则此构造函数将创建一个使用这些覆盖的 CultureInfo 对象...

对于 GetCultureInfo:

如果name是当前区域性的名称,则返回的 CultureInfo 对象不反映任何用户覆盖。这使得该方法适用于在系统上没有真实用户帐户并且需要有效加载多种文化的服务器应用程序或工具。

更新:如果.ToString("C", new CultureInfo("en-US"))有效但.ToString("C")无效,那么问题可能是某些其他代码为您的线程分配了一个自定义 CultureInfo,其中“US$”作为货币符号。

于 2014-11-12T17:25:28.273 回答
3

测试Mike McCaughan提供的内容我认为它会删除US但它也会添加$$到现有的货币中。我已经对此进行了测试,这将起作用,但是我认为有一些更好的方法可以做到这一点,但这将产生以下结果

删除US最初将在一行中解决此问题..

var currency = "US$5,365.20".Replace("US", string.Empty);

或替代

B.K接受建议,您甚至可以将其从 3 行提升到 2行

var currency = 5365.20M;
var finalCurrency = currency.ToString("C", new CultureInfo("en-US")).Replace("US", string.Empty);
于 2014-11-12T17:02:52.693 回答
1

您可以更改该特定文化的浅层克隆的货币符号:

var d = 2353.23M;
var currencyFormat = (NumberFormatInfo)CultureInfo.GetCultureInfo("en-US").NumberFormat.Clone();
currencyFormat.CurrencySymbol = "$"; // Change to something like %^# to test it
var currency = d.ToString("C", currencyFormat);
于 2014-11-12T17:10:47.750 回答