货币格式的显示

68

有没有一种方法可以为一个国家格式化正确的货币表示方式?

例如:

  • 英国 -£127.54
  • 荷兰 € 127,54-
  • 美国 $127.54

等等。

需要考虑以下几点:

  1. 货币符号

  2. 货币符号的位置 -- 可以放在数字前或后。

  3. 负数显示方式

8个回答

119

尝试使用货币格式说明符(“C”),可以通过String.Format或数值类型的重载ToString方法使用。该说明符会自动考虑当前 UI 区域设置,并相应地显示货币值。

例如:

这里提供更多详细信息。

decimal value = 12345.6789M; // Be sure to use Decimal for money values. Do not use IEEE-754 types such as float (System.Single) and double (System.Double) as they can only store approximate values.
Console.WriteLine(value.ToString("C", CultureInfo.CurrentCulture));

Console.WriteLine(value.ToString("C3", CultureInfo.CurrentCulture));

Console.WriteLine(value.ToString("C3", CultureInfo.CreateSpecificCulture("da-DK")));

// The example displays the following output on a system whose
// current culture is English (United States):
//       $12,345.68
//       $12,345.679
//       kr 12.345,679

1
未来读者请注意,小数是货币值的首选类型。有关详细信息,请参见Zneak的此答案:https://dev59.com/h2865IYBdhLWcg3wnP2a#3730040 - Trevor.Screws

44

这种功能已经内置。

在使用十进制数时,您可以使用格式化字符串"C"或"c"。(格式化字符串链接)

decimal dec = 123.00M;
string uk = dec.ToString("C", new CultureInfo("en-GB")); // uk holds "£123.00"
string us = dec.ToString("C", new CultureInfo("en-US")); // us holds "$123.00"

22

链接已失效,请尝试使用以下链接:https://learn.microsoft.com/en-us/globalization/locale/currency-formatting-in-the-dotnet-framework - keithl8041

10

使用.ToString("C", culture)将一个给定的数值显示为货币格式的问题在于它会将数值转换为指定文化中默认的货币。如果你有一个数值,该数值对应的ISO货币代码,并且想要在指定文化中显示它,我建议创建一个类似下面所示的十进制扩展方法。这样不会自动假设货币是指定文化中的默认货币:

public static string ToFormattedCurrencyString(
    this decimal currencyAmount,
    string isoCurrencyCode,
CultureInfo userCulture)
{
    var userCurrencyCode = new RegionInfo(userCulture.Name).ISOCurrencySymbol;

    if (userCurrencyCode == isoCurrencyCode)
    {
        return currencyAmount.ToString("C", userCulture);
    }

    return string.Format(
        "{0} {1}", 
        isoCurrencyCode, 
        currencyAmount.ToString("N2", userCulture));
}

这将使用本地货币符号或ISO货币代码与金额,以更合适的方式进行显示。有关此主题的更多信息,请参阅此博客文章


1
在某些文化中,数字格式与货币格式不同,因此无法适用于任何文化。您最好接受随着货币变化而更改您的格式,或者您需要完全自己进行格式化。 - Martin Braun
有些货币有0或3位小数,不能简单地使用2位小数。 - undefined

3

如果您只有货币符号和小数位数,您可以使用以下辅助函数。该函数尊重符号/金额顺序、分隔符等,仅更改货币符号本身和要显示的小数位数。

public static string FormatCurrency(string currencySymbol, Decimal currency, int decPlaces)
{
    NumberFormatInfo localFormat = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
    localFormat.CurrencySymbol = currencySymbol;
    localFormat.CurrencyDecimalDigits = decPlaces;
    return currency.ToString("c", localFormat);
}

3
这段代码-(将货币设置为英镑/英国/英格兰/£,然后打印一行。然后将货币设置为美元/$并打印一行)。
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB",false);         
Console.WriteLine("bbbbbbb   {0:c}",4321.2);
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US",false);
Console.WriteLine("bbbbbbb   {0:c}",4321.2);

将显示-

bbbbbbb   £4,321.20
bbbbbbb   $4,321.20

获取文化名称列表,例如 en-GB、en-US 等等。
http://msdn.microsoft.com/zh-cn/library/system.globalization.cultureinfo(v=vs.80).aspx


0

有时候你可能根本无法使用文化方法,例如当你想要独立于任何文化或货币进行特定格式化时。即使是@jackjgordon的方法也不可靠,因为一些文化具有不同的数字格式和货币格式,导致不一致。

这里有一个手动格式化程序,可以独立地格式化您的数字,而不需要任何文化支持。

public static class CustomNumberFormatExtensions
{
    static readonly StringBuilder formatTextBuilder = new StringBuilder();

    public static string ToCustomFormattedString(this decimal d, int decimalPrecision, string decimalPoint, string groupSeperator = "", int groupLength = 3, MidpointRounding rounding = MidpointRounding.AwayFromZero)
    {
        lock (formatTextBuilder)
        {
            formatTextBuilder.Clear();

            string rawDigits = Math.Round(d * (decimal)Math.Pow(10, decimalPrecision), 0, rounding).ToString();
            rawDigits = rawDigits.PadLeft(decimalPrecision + 1, '0');

            if (decimalPrecision > 0)
            {
                formatTextBuilder.Insert(0, rawDigits.Substring(rawDigits.Length - decimalPrecision));
                rawDigits = rawDigits.Substring(0, rawDigits.Length - decimalPrecision);
                formatTextBuilder.Insert(0, decimalPoint);
            }

            while (rawDigits.Length > groupLength)
            {
                formatTextBuilder.Insert(0, rawDigits.Substring(rawDigits.Length - groupLength));
                rawDigits = rawDigits.Substring(0, rawDigits.Length - groupLength);
                formatTextBuilder.Insert(0, groupSeperator);
            }

            return rawDigits + formatTextBuilder.ToString();
        }
    }

    public static string ToCustomFormattedString(this double d, int decimalPrecision, string decimalSeperator, string groupSeperator = "", int groupLength = 3, MidpointRounding rounding = MidpointRounding.AwayFromZero)
    {
        return ((decimal)d).ToCustomFormattedString(decimalPrecision, decimalSeperator, groupSeperator, groupLength, rounding);
    }
}

-7
public static string ToFormattedCurrencyString(
    this decimal currencyAmount,
    string isoCurrencyCode,
    CultureInfo userCulture)
{
    var userCurrencyCode = new RegionInfo(userCulture.Name).ISOCurrencySymbol;

if (userCurrencyCode == isoCurrencyCode)
{
    return currencyAmount.ToString("C", userCulture);
}

return string.Format(
    "{0} {1}", 
    isoCurrencyCode, 
    currencyAmount.ToString("N2", userCulture));

}


7
与 @jakejgordon 两年前的回答完全相同。 - kristianp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接