24

这应该是一个简单的问题,但是......

我需要在 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 ₫ - 正确符号,错误使用 , 和 . 对于当前用户。

这篇文章提供了更多关于正确做事的细节,但没有给出如何去做。

我缺少什么隐藏在框架中的明显方法?

4

3 回答 3

30
  • NumberFormatInfo从用户的货币中获取,并克隆它
  • CurrencySymbol克隆格式中的设置CurrencySymbol为相关货币的
  • 如果您希望复制货币头寸(以及格式的某些其他方面),请以CurrencyPositivePattern相同CurrencyNegativePattern的方式进行设置。
  • 使用结果进行格式化。

例如:

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

诚然,我的控制台无法显示正确的符号,但我确信这只是由于字体问题 :)

于 2009-07-01T20:44:22.537 回答
1

对不起,我在这里可能有点慢,但我仍然不明白你的意思。在我看来,最初的问题是“我有一个越南盾值,在越南,我想按照越南货币格式显示,带有“₫”符号,在美国,我想按照美国货币格式显示,但仍然带有“₫”。” .

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

如果您只想更改货币符号,并按照当前文化保留格式,那么克隆 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);
于 2011-11-11T13:33:01.653 回答
-1

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

textBox2.Text = "Rp" + (textBox1.Text = string.Format(System.Globalization.CultureInfo.GetCultureInfo("id-ID"), "{0:#,##0.00}", double.Parse(textBox1.Text)));
于 2013-04-04T19:45:31.960 回答