Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to remove the thousand separator using cultureinfo?

I try to remove the thousand separator so I'm experimenting some code, but it throws and exception. I tried with Convert.ToDouble, Convert.ToDecimal etc.

it says:

Convert.ToDouble("1.234,45") threw and exception of 'System.FormatException'

The conversion is thrown from line : Convert.ToDouble()

The argument n2 uses the culturinfo, but I also tried "0.00" both throws the same exception

The whole idea is : how to remove the thousand separator, my input is always in this format: 1.234,54 (comma as decimal and dot as thousand separator)... I like to use it in Textbox GotFocus Event.. so the format should be shown like 12345,45

so : 1.254,45 should be 1254,45 and 1.254,00 should be 1254,00

 //http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

CultureInfo ci = CultureInfo.GetCultureInfo("NL-be");
NumberFormatInfo nfi = (NumberFormatInfo)ci.NumberFormat.Clone();
//Now force thousand separator to be empty string
nfi.NumberGroupSeparator = "";
//Format decimal number to 2 decimal places
string decimalFormatted = Convert.ToDouble("1.234,45").ToString("0.00", nfi);
string decimalFormatted = Convert.ToDouble("1.234,45").ToString("n2", nfi);
like image 781
ethem Avatar asked Mar 21 '13 11:03

ethem


2 Answers

Specify the culture with conversion and it will work like:

CultureInfo ci = CultureInfo.GetCultureInfo("NL-be");
double d = Convert.ToDouble("1.234,45", ci);
like image 102
Habib Avatar answered Nov 15 '22 14:11

Habib


Your calls to Convert.ToDouble don't specify a format at all. You need to remember that this:

string decimalFormatted = Convert.ToDouble("1.234,45").ToString("n2", nfi);

is equivalent to:

double tmp = string decimalFormatted = Convert.ToDouble("1.234,45");
string decimalFormatted = tmp.ToString("n2", nfi);

It's the first line that's failing, not the second... and in the first line, it's just going to use the current thread culture.

I suggest you use Double.Parse instead, and specify the format there. (You could use Convert.ToDouble instead, but I generally prefer the more type-specific Double.Parse etc calls. It means there's less to change if you move to TryParse etc.)

You should also consider using decimal instead of double if the exact digits matter. For example, if this is a currency value, it's logically more of a decimal number than a double number.

like image 35
Jon Skeet Avatar answered Nov 15 '22 14:11

Jon Skeet