Search code examples
c#.netglobalizationiformatprovider

How to use NumberFormatInfo to remove parenthesis for negative values


We're currently using the following for creating US dollar values in our web application:

string.Format("{0:C0}", dollarValue );

In this example, if dollarValue is 145, then we'll see: $145. If it is -145, then we'll see ($145) rather than -$145. Note that for us, dollarValue is a double, but it could be any number-type. I think.

Anyway, what I want is for it to be either $145 or -$145.

Now, according to my research, it might be possible to do this using the NumberFormatInfo class. I can't figure out how to use it, and I can't find any valid example. I did see this question here: C# creating a custom NumberFormatInfo to display "Free" when a currency value is $0.00 but the example from MSDN linked to from this question seems a bit different from what I really want to do.

I realize, I will need to do something of the following:

double dollarValue = -145d;
string myMoney = dollarValue.ToString( "C0", someIFormatProvider );

where someIFormatProvider is likely of type NumberFormatInfo. Now, what I've done is this:

NumberFormatInfo ni = new NumberformatInfo();
ni.CurrencyNegativePattern = 1; // The value 1 should mean not to use parenthesis
string myMoney = dollarValue.ToString( "C0", ni );

...and I get an "Instance is Read-Only" exception. While the "documentation" for the CurrencyNegativePattern property says you can SET and GET the value, apparently, you can't. Also, NumberFormatInfo is a sealed class. I can't easily create a new class based off it and override the value.

I'm at a loss as to how to deal with this. Right now, my workaround is to just negate my negative value and have a positive result that I do the string.Format(...) again. Yes, I realize there is no negative sign in front of this, but, of course, that's easily resolved by adding a "-" in front of the result as needed.

Would someone be able to provide me with a working example of how to effectively use the NumbefFormatInfo class correctly in this situation? Thanks.


Solution

  • double dollarValue = -145d;
     System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
     string mymoney = dollarValue.ToString("C", modCulture);
              MessageBox.Show(mymoney);
    

    If your Operating System current culture is en-US then you dont need the following line

    System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
    

    The code will be

    double dollarValue = -145d;
    string mymoney = dollarValue.ToString("C");
    

    and If you want to do with NumberFormatInfo

    double dollarValue = -145d; 
    System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
         NumberFormatInfo number = modCulture.NumberFormat;
         string mymoney = dollarValue.ToString("C", number);
    

    another way

    double dollarValue = -145d;
    System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
    NumberFormatInfo number = modCulture.NumberFormat;
    string mymoney = dollarValue.ToString(String.Format("C",number));
    Console.WriteLine(mymoney);