格式化字符串"{0:C2}"(货币格式)将负数视为正数。

21

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

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

4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
33

我说的对吗?它把它放在括号里,即它格式化为($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);
}

2
太棒了。我在boo中运行了一个快速的string.Format('{0:C2}', -1234),得到了'-$1,234.00',并且以为Shimmy可能弄错了(对不起Shimmy)。我没有意识到加拿大和美国在NumberFormat.CurrencyNegativePattern上有所不同。 - Blair Conrad
1
如果你想在一个调用中完成所有操作,你需要将其放在某个辅助方法中。我不明白你是如何在“$-1234.56”中显示2个前导零的。你可能需要更新你的问题,以展示你实际上想要什么(因为你不想要$-1234,与问题相反)。 - Jon Skeet
这并不特别奇怪 - 这是各种会计系统中表示负值的方式。 - Jon Skeet
当然可以。(这就是为什么它是NumberFormatInfo的一部分。) - Jon Skeet
你如何在XAML中使用自定义的NumberFormatInfo类,并在绑定表达式中使用StringFormat?我可以创建一个本地资源并设置NegativePattern属性,但是接下来呢? - Antony
显示剩余3条评论

25

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

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

或者,如果货币符号需要成为参数,你可以这样做

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

这是一个很好的答案。谢谢! "{0:$#,0.00}" 怎么样?它在我这里似乎也能起到同样的作用,我想知道我可能错过了哪些情况。 - gneri
微软:把简单的事情复杂化。 - Vassilis
有人能解释一下这段代码 String.Format("{0:$#,##0.00}", -1234) 的奥秘吗?或者我可以在哪里学到更多相关知识? - Gilbert R.

10

我想我会简单地使用:

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

(在Microsoft.VisualBasic.Strings模块中)

或者用更简洁的话来说(这是我实际要使用的):

FormatCurrency(-1234.56, 2, 0, 0)

否则我会自己制作一个使用VB函数并传递自定义参数的自定义formatcurrency函数。

更多详细信息,请查看msdn中的FormatCurrency函数(Visual Basic)


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

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