【问题标题】:Remove 'US' before '$' in currency displaying在货币显示中删除“$”之前的“US”
【发布时间】:2014-11-12 16:33:28
【问题描述】:

我正在使用.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),当前的货币符号是“US$”。当前的文化名称是“en-US”。

【问题讨论】:

  • 我以前从未见过,你确定你没有将US 附加到你的字符串中吗?发布违规代码。
  • 你能分享你的代码sn-p吗?似乎按这里的设计工作:dotnetfiddle.net/RSOHZE
  • 要获取现有的CultureInfo,我认为你需要使用CultureInfo.GetCultureInfo("en-US")
  • @MikeMcCaughan 你不知道,new CultureInfo("en-US") 很好
  • @mattytommo 整洁。学到了一些新东西:)。 @Eugen,看看(new CultureInfo("en-US")).NumberFormat.CurrencySymbol 的输出,看看美国是否在$ 前面。

标签: c# asp.net currency-formatting


【解决方案1】:

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

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$”作为货币符号。

【讨论】:

  • 问题是new CultureInfo("en-US") 对我有用,如我所见,请检查我的 UPD。然后很奇怪,根据您的说法,它不应该起作用。但我认为无论如何,压倒一切可能是一个原因。
  • 您确定 UPD 中的其他标签使用 .ToString("C", new CultureInfo("en-US")) 吗?另请注意,仅当 Windows 区域实际上是“英语(美国)”时,此代码才会应用用户覆盖。
  • 是的,我确定。关于窗口设置。无论如何,我使用了本地区域的日期、货币和其他设置(我已经用美国设置检查过,同样)。 DotNetNuke CMS 设置的文化设置是该 Web 应用程序的基础。所以现在我认为问题就在那里。
【解决方案2】:

测试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);

【讨论】:

  • 为什么不首先将US 替换为String.Empty,而不必用美元符号跳过箍?
  • 这也是真的.. 我将编辑答案以显示替代方案
  • @DJKRAZE,是的,我可以替换它。但我在数百个地方使用它。我认为更好的主意是在应用程序上更改CurrencySymbol。在我寻找另一个解决方案时开始。
【解决方案3】:

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

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);

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多