货币格式

Rya*_*yan 22 .net c#

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

我需要在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
Run Code Online (Sandbox Code Playgroud)

(格式化为代码,因此很容易看出它们之间的区别,和.)

所以代码就像

Double vietnamTotal = 1234.56;
return vietnamTotal.ToString("c");  
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我错过了隐藏在框架中的明显方法?

Jon*_*eet 28

  • 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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