Reputation: 5511
I'm trying not to use the ',' char as a thousand separator when displaying a string, but to use a space instead. I guess I need to define a custom culture, but I don't seem to get it right. Any pointers?
eg: display 1000000 as 1 000 000 instead of 1,000,000
(no, String.Replace()
is not the solution I'd like to use :P)
Upvotes: 43
Views: 42293
Reputation: 3931
I wanted to
This code solves it:
var regex = new Regex(@"(^|(?<=-))\s*");
var format = "### ### ### ### ##0.##";
decimal number = 123456789.54m;
var str = regex.Replace(number.ToString(format), ""); // str = "123 456 789.54"
Here are examples of how this behaves for various numbers:
regex.Replace(0m.ToString(format), "")
"0"
regex.Replace(123m.ToString(format), "")
"123"
regex.Replace(123456789m.ToString(format), "")
"123 456 789"
regex.Replace(123456789.1m.ToString(format), "")
"123 456 789.1"
regex.Replace(123456789.12m.ToString(format), "")
"123 456 789.12"
regex.Replace(123456789.1234m.ToString(format), "")
"123 456 789.12"
regex.Replace((-123456789.1234m).ToString(format), "")
"-123 456 789.12"
regex.Replace((-1234m).ToString(format), "")
"-1 234"
regex.Replace((-1m).ToString(format), "")
"-1"
Upvotes: 0
Reputation: 2057
There's a slightly simpler version of Jon Skeet one :
using System;
using System.Globalization;
class Test
{
static void Main()
{
NumberFormatInfo nfi = new NumberFormatInfo {NumberGroupSeparator = " ", NumberDecimalDigits = 0};
Console.WriteLine(12345678.ToString("n", nfi)); // 12 345 678
}
}
And the 'nfi' initialization could be skipped and put directly as parameter into the ToString() method.
Upvotes: 7
Reputation: 1503649
I suggest you find a NumberFormatInfo
which most closely matches what you want (i.e. it's right apart from the thousands separator), call Clone()
on it and then set the NumberGroupSeparator
property. (If you're going to format the numbers using currency formats, you need to change CurrencyGroupSeparator
instead/as well.) Use that as the format info for your calls to string.Format
etc, and you should be fine. For example:
using System;
using System.Globalization;
class Test
{
static void Main()
{
NumberFormatInfo nfi = (NumberFormatInfo)
CultureInfo.InvariantCulture.NumberFormat.Clone();
nfi.NumberGroupSeparator = " ";
Console.WriteLine(12345.ToString("n", nfi)); // 12 345.00
}
}
Upvotes: 80
Reputation: 60276
Create your own NumberFormatInfo (derivative) with a different thousand separator.
Upvotes: 9