货币格式

这应该是一个容易的问题,但……

我需要在C#中格式化显示(字符串)的货币

有问题的货币将有自己的规则,例如要使用的符号以及该符号是否应该在值之前(例如10美元)或之后(例如10₫,即越南盾)。

但数字的格式取决于用户本地,而不是货币。

例如

1.234,56 ₫ should be displayed to a user in Vietnam but 1,234.56 ₫ should be displayed to a user in the US 

(格式化为代码,以便于查看之间的差异,和。)

所以代码就像

 Double vietnamTotal = 1234.56; return vietnamTotal.ToString("c"); 

将无法工作,因为它将使用用户(或更准确的CultureInfo.CurrentCulture)区域设置格式和货币,所以你会得到$ 1,123.56之类的东西 – 正确使用,和。 但错误的符号。

 Double vietnamTotal = 1234.56; CultureInfo ci = new CultureInfo(1066); // Vietnam return vietnameTotal.ToString("c",ci)); 

会给1.234,56₫ – 正确的符号,错误的使用,和。 对于当前用户。

这篇文章提供了有关正确的事情的更多细节 ,但没有提供如何做到这一点。

我遗漏了哪些隐藏在框架中的明显方法?

  • 从用户的货币中获取NumberFormatInfo并克隆它
  • 将克隆格式的CurrencySymbol设置为相关CurrencySymbolCurrencySymbol
  • 如果要复制货币位置(以及格式的某些其他方面),请以相同方式设置CurrencyPositivePatternCurrencyNegativePattern
  • 使用结果进行格式化。

例如:

 using System; using System.Globalization; class Test { static void Main() { decimal total = 1234.56m; CultureInfo vietnam = new CultureInfo(1066); CultureInfo usa = new CultureInfo("en-US"); NumberFormatInfo nfi = usa.NumberFormat; nfi = (NumberFormatInfo) nfi.Clone(); NumberFormatInfo vnfi = vietnam.NumberFormat; nfi.CurrencySymbol = vnfi.CurrencySymbol; nfi.CurrencyNegativePattern = vnfi.CurrencyNegativePattern; nfi.CurrencyPositivePattern = vnfi.CurrencyPositivePattern; Console.WriteLine(total.ToString("c", nfi)); } } 

不可否认,我的控制台无法显示正确的符号,但我确信这只是因为字体问题:)

对不起,我在这里可能会有点慢,但我仍然没有看到你的观点。 在我看来,原来的问题是“我有一个东方价值,在越南,我希望按照越南货币格式显示,带有”₫“符号,而在美国,我希望按照美国货币格式显示,但仍然带着“₫”。“

我想我对两个相互矛盾的陈述感到困惑…… “有问题的货币将有自己的规则”“数字的格式取决于用户本地[原文如此],而不是货币。”

如果您想要更改的只是货币符号,并按照当前文化保留格式,那么不会克隆nfi并设置符号就足够了吗?

  NumberFormatInfo nfi; // pretend we're in Vietnam Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("vi-VN"); nfi = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo; nfi.CurrencySymbol = "₫"; String s1 = (1234.5678).ToString("c", nfi); // pretend we're in America Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); nfi = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo; nfi.CurrencySymbol = "₫"; String s2 = (1234.5678).ToString("c", nfi); 

要使用文本框,请尝试以下操作:

 textBox2.Text = "Rp" + (textBox1.Text = string.Format(System.Globalization.CultureInfo.GetCultureInfo("id-ID"), "{0:#,##0.00}", double.Parse(textBox1.Text)));