String.Format(“{0:C2}”, - 1234)(货币格式)将负数视为正数

时间:2009-06-16 12:18:12

标签: c# vb.net string-formatting currency string.format

我正在使用String.Format("{0:C2}", -1234)格式化数字。

它总是将金额格式化为正数,而我希望它变为$ - 1234

4 个答案:

答案 0 :(得分:30)

我是否正确地说它将它放在括号中,即它将其格式化为($1,234.00)?如果是这样,我认为这是美国的预期行为。

但是,您可以创建自己的NumberFormatInfo,但这种行为并不常见。取一个“大部分正确”的现有NumberFormatInfo,调用Clone()制作一个可变副本,然后适当地设置CurrencyNegativePattern(我认为你想要值2)。

例如:

using System;
using System.Globalization;

class Test
{
    static void Main()
    {
        var usCulture = CultureInfo.CreateSpecificCulture("en-US");
        var clonedNumbers = (NumberFormatInfo) usCulture.NumberFormat.Clone();
        clonedNumbers.CurrencyNegativePattern = 2;
        string formatted = string.Format(clonedNumbers, "{0:C2}", -1234);
        Console.WriteLine(formatted);
    }
}

这打印$ -1,234.00。如果您确实需要$ -1234,则需要将CurrencyGroupSizes属性设置为new int[]{0},并使用"{0:C0}"代替"{0:C2}"作为格式字符串。

编辑:这是一个你可以使用的辅助方法,基本上做同样的事情:

private static readonly NumberFormatInfo CurrencyFormat = CreateCurrencyFormat();

private static NumberFormatInfo CreateCurrencyFormat()
{
    var usCulture = CultureInfo.CreateSpecificCulture("en-US");
    var clonedNumbers = (NumberFormatInfo) usCulture.NumberFormat.Clone();
    clonedNumbers.CurrencyNegativePattern = 2;
    return clonedNumbers;
}

public static string FormatCurrency(decimal value)
{
    return value.ToString("C2", CurrencyFormat);
}

答案 1 :(得分:22)

另一个简单的选择是手动指定格式字符串。

String.Format("{0:$#,##0.00}", -1234)

或者,如果货币符号需要是参数,则可以执行此操作

String.Format("{0:" + symbol + "#,##0.00}", -1234)

答案 2 :(得分:9)

我想我会简单地使用:

FormatCurrency(-1234.56, 2, UseParensForNegativeNumbers:=TriState.False)

(在Microsoft.VisualBasic.Strings模块中)

或者用较短的词语(这就是我实际要使用的):

FormatCurrency(-1234.56, 2, 0, 0)

或者我将自己制作一个自定义格式货币函数,它使用VB函数传递我的自定义参数。

有关详细信息,请查看msdn。中的FormatCurrency Function (Visual Basic)

答案 3 :(得分:0)

#region Format value to currency
    /// <summary>
    /// Method to format input in currency format
    ///  Input:  -12345.55
    ///  Output:$-12,345.55  
    /// </summary>
    /// <param name="Input"></param>
    /// <returns></returns>
    public static string FormatToCurrency(string Input)
    {
        try
        {
            decimal value = Convert.ToDecimal(Input);
            CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
            culture.NumberFormat.NumberNegativePattern = 2;
            return string.Format(culture, "{0:C}", value);
        }
        catch (Exception)
        {
            return string.Empty;
        }
    }
    #endregion