views:

4315

answers:

2

Hi I am using String.Format("{0:C2}", -1234)

to format numbers.

is always formats the amount to a positive number, while I want it to become $-1234

+7  A: 

Am I right in saying it's putting it in brackets, i.e. it's formatting it as ($1,234.00) ? If so, I believe that's the intended behaviour for the US.

However, you can create your own NumberFormatInfo which doesn't behave this way. Take an existing NumberFormatInfo which is "mostly right", call Clone() to make a mutable copy, and then set the CurrencyNegativePattern appropriately (I think you want value 2).

For example:

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

This prints $-1,234.00. If you actually want exactly $-1234, you'll need to set the CurrencyGroupSizes property to new int[]{0} and use "{0:C0}" instead of "{0:C2}" as the format string.

EDIT: Here's a helper method you can use which basically does the same thing:

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);
}
Jon Skeet
Excellent catch. I ran a quick string.Format('{0:C2}', -1234) in boo, got '-$1,234.00' and thought Shimmy was somehow mistaken (sorry Shimmy). I didn't realize that Canada and the US differed on NumberFormat.CurrencyNegativePattern.
Blair Conrad
I want to do everything in one line.Also I wanna get a result format decimal negatives with 2 leading zeros (i.e. $-1234.56)
Shimmy
If you want to do everything in one call, you'll need to put this in a helper method somewhere. I don't see how you've shown 2 leading zeros in "$-1234.56". You might want to update your question to show what you *actually* want (as you don't want $-1234, contrary to the question).
Jon Skeet
BTW, yes, it's putting in brackets, that's weird.
Shimmy
It's not particularly weird - that's how negative values are represented in various accounting systems.
Jon Skeet
is it up to culture?
Shimmy
Absolutely. (That's why it's part of NumberFormatInfo.)
Jon Skeet
+1  A: 

I think I will simply use:

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

(in Microsoft.VisualBasic.Strings module)

Or in shorter words (this is what im actually going to use):

FormatCurrency(-1234.56, 2, 0, 0)

Or I will make myself a custom formatcurrency function that uses the VB function passing my custom params.

For further details take a look at the FormatCurrency Function (Visual Basic) in the msdn.

Shimmy