Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

String.Format("{0:C2}", -1234) (Currency format) treats negative numbers as positive

Tags:

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

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

like image 923
Shimmy Weitzhandler Avatar asked Jun 16 '09 12:06

Shimmy Weitzhandler


2 Answers

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);
}
like image 120
Jon Skeet Avatar answered Sep 20 '22 09:09

Jon Skeet


Another simple option is manually specify the format string.

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

Or, if the currency symbol needs to be a parameter, you could do this

String.Format("{0:" + symbol + "#,##0.00}", -1234)
like image 28
epotter Avatar answered Sep 21 '22 09:09

epotter