Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

This should be an easy problem but...

I need to format a currency for display (string) in C#

The currency in question will have its own rules such as the symbol to use and if that symbol should come before the value (e.g. $ 10) or after (e.g. 10 ? which is Vietnamese Dong).

But how the numbers are formatted depends upon the users local, not the currency.

E.g.

1.234,56 ? should be displayed to a user in Vietnam but 
1,234.56 ? should be displayed to a user in the US

(formatted as code so easy to see difference between , and.)

So code like

Double vietnamTotal = 1234.56;
return vietnamTotal.ToString("c");  

Won't work as it will use the users (or more accuratly CultureInfo.CurrentCulture) locale for format and currency so you would get things like $1,123.56 - right use of , and . but wrong symbol.

Double vietnamTotal = 1234.56;
CultureInfo ci = new CultureInfo(1066); // Vietnam
return vietnameTotal.ToString("c",ci)); 

Would give 1.234,56 ? - Right symbol, wrong use of , and . for current user.

This post gives more detail on the right thing to do, but not how to do it.

What obvious method hidden in the framework am I missing?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
266 views
Welcome To Ask or Share your Answers For Others

1 Answer

  • Take the NumberFormatInfo from the user's currency, and clone it
  • Set the CurrencySymbol in the cloned format to the CurrencySymbol of the currency in question
  • If you want the currency position (and some other aspects of the format) to be copied, set CurrencyPositivePattern and CurrencyNegativePattern in the same way.
  • Use the result to format.

For example:

using System;
using System.Globalization;

class Test
{    
    static void Main()
    {
        decimal total = 1234.56m;
        CultureInfo vietnam = new CultureInfo(1066);
        CultureInfo usa = new CultureInfo("en-US");

        NumberFormatInfo nfi = usa.NumberFormat;
        nfi = (NumberFormatInfo) nfi.Clone();
        NumberFormatInfo vnfi = vietnam.NumberFormat;
        nfi.CurrencySymbol = vnfi.CurrencySymbol;
        nfi.CurrencyNegativePattern = vnfi.CurrencyNegativePattern;
        nfi.CurrencyPositivePattern = vnfi.CurrencyPositivePattern;

        Console.WriteLine(total.ToString("c", nfi));
    }
}

Admittedly my console doesn't manage to display the right symbol, but I'm sure that's just due to font issues :)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...