52

Assume I have the following decimal number that I have to format so that every thousand should be separated with a space:

 897.11 to 897.11
 1897.11 to 1 897.11
 12897.11 to 12 897.11
 123897.11 to 123 897.11

I have tried Decimal.ToString("0 000.00"). Although this works pretty well when the number is 1897.11. But when it's 897.11 I get 0 897.11.

Mikayil Abdullayev
  • 12,117
  • 26
  • 122
  • 206

7 Answers7

95

Pass in a custom NumberFormatInfo with a custom NumberGroupSeparator property, and use the #,# format to tell it to do number groups. This example uses the invariant culture's number format as its basis.

var nfi = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone();
nfi.NumberGroupSeparator = " ";
string formatted = 1234897.11m.ToString("#,0.00", nfi); // "1 234 897.11"
n00b
  • 5,642
  • 2
  • 30
  • 48
Tim S.
  • 55,448
  • 7
  • 96
  • 122
  • 4
    +1 , I have edited this answer to handle zero values properly - the previous format string "#,#.00" caused zero to be represented as ".00" now it is "0.00" – n00b Apr 23 '16 at 20:51
23

You need a custom number format provider where you change the character yourself:

    static void Main(string[] args)
    {
        decimal d = 2000000;

        var f = new NumberFormatInfo {NumberGroupSeparator = " "};

        var s = d.ToString("n", f); // 2 000 000.00
    }

Here I also specify to format it as a number (using "n"), please see this link for other formatting options:

Standard Numeric Format Strings

In this case, it won't work if you format as a currency or a percentage, because as you may already note the NumberFormatInfo has separate properties for those.

The current culture format info can be found on System.Globalization.CultureInfo.CurrentCulture.NumberFormat.

Adam Houldsworth
  • 63,413
  • 11
  • 150
  • 187
13

try this

int testNumber = 134566548;
Console.WriteLine(string.Format("{0:N}", testNumber));

You will received : 134 566 548,00

Don't forget your culture.

Matthieu M
  • 149
  • 3
11

with a custom format string, but use '#' not '0's a 0 is a mandatory token it will be there no matter how long the number is, the pound sign (#) is optional token, it will only be used for digits actually in the number.

  Decimal.ToString("# ###.00")  

NOTE. I'll leave this here, but @Tim S' answer is a better one.

When I try this I see it only generates the first separator... I guess the separator only works for commas and periods here. As a workaround (up to the maximum size number you expect), try this instead.

  Decimal.ToString("# ### ### ### ###.00")  
Charles Bretana
  • 143,358
  • 22
  • 150
  • 216
4

Norwegian locale uses spaces as a separator, so if you were designing a website or application specifically for Norwegians, then you could use:

(123897.11).ToString("n",new CultureInfo("nb-NO"))

Which results in

"123 897,11"

Obviously, if you're not writing an application for the Norwegian market, then this would be a silly solution.

Fiach Reid
  • 6,149
  • 2
  • 30
  • 34
  • I used something like `(123897.11).ToString("n4",new CultureInfo("nb-NO"))` for 4 decimal places. Tks. – sergiol Nov 22 '22 at 16:14
4

Sweden Use thousand separator as Space(" ") and Decimal point separator as Comma(,). We can achieve this in the following way.

decimal myNumbber = 5878.476M;
var swedishCulture = new CultureInfo("sv-SE");           
swedishCulture.NumberFormat.NumberDecimalSeparator = ",";
swedishCulture.NumberFormat.NumberGroupSeparator = " ";
var s = myNumbber.ToString("#,###.00", swedishCulture);

Which gives the output

"5 878,48"
Md. Nazrul Islam
  • 2,809
  • 26
  • 31
  • 1
    Question, why would you need to specify the separator values? Aren't these already defined in the CultureInfo's NumberFormatInfo property? – Justin Greywolf Mar 17 '20 at 17:35
0
double salaire = 0;
string salaire_s = "0";

private void txtSalaire_TextChanged(object sender, EventArgs e)
{
    txtSalaire.Text = FormatMontant(salaire_s);
    txtSalaire.Select(txtSalaire.Text.Length, 0);
}

private void txtSalaire_KeyPress(object sender, KeyPressEventArgs e)
{
    salaire = ClassUtility.AllowNumbersFormatDecimal(e, salaire_s);
    salaire_s = salaire.ToString();
}

public static string FormatMontant(string montant_string)
{
    double montant = 0;
    if (montant_string.Equals(""))
    {
        montant_string = "0";
    }
    montant = Convert.ToDouble(montant_string);
    return String.Format("{0:n0}", montant);
}
  • Thank you for your interest in contributing to the Stack Overflow community. This question already has quite a few answers—including one that has been extensively validated by the community. Are you certain your approach hasn’t been given previously? **If so, it would be useful to explain how your approach is different, under what circumstances your approach might be preferred, and/or why you think the previous answers aren’t sufficient.** Can you kindly [edit] your answer to offer an explanation? – Jeremy Caney May 18 '23 at 17:46