如何使用CultureInfo去除千位分隔符?

6

我试图去掉千分位,所以我正在尝试一些代码,但它会抛出异常。我尝试使用Convert.ToDoubleConvert.ToDecimal等方法。

报错信息如下:

Convert.ToDouble("1.234,45") 抛出了 'System.FormatException' 异常

这个转换错误发生在 Convert.ToDouble() 方法的这一行。

参数 n2 使用了 CultureInfo,但我也尝试过 "0.00",两种方式都抛出相同的异常。

整个想法是:如何去掉千分位,我的输入格式始终为 1.234,54(逗号为小数点,点为千分位)…… 我希望在 Textbox GotFocus 事件中使用它,因此格式应该显示为 12345,45。

所以:1.254,45 应该变成 1254,45,1.254,00 应该变成 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);

对于不变文化: Convert.ToDouble("1.234,45", CultureInfo.InvariantCulture) 否则: Convert.ToDouble("1.234,45", CultureInfo.GetCultureInfo("en-gb")) - Fendy
这两行代码都会产生相同的错误。 - ethem
2个回答

6

使用转换指定文化并且它会像这样工作:

CultureInfo ci = CultureInfo.GetCultureInfo("NL-be");
double d = Convert.ToDouble("1.234,45", ci);

谢谢,这段代码对我很有用。但是它是如何工作的呢?因为 NL-be 有千位分隔符 DOT,所以它应该仍然显示点号吧? - ethem
“@ Habib”:我发现一个问题: 规则是逗号后面的一切都是小数,除了#1情况:如果我输入1234,00并离开(它会变成:或者123.400,00),当我输入1234,56时,它会变成123.456,00)...所以当我使用逗号作为小数时,结果不好...如果我输入1234.56,它会变成1.234,56,这很好。那么我该如何修复1234,56呢?它不应该变成123.456,00,而应该变成1.234,56。还有,输入12,34变成1234,00。请给予建议? - ethem
using System.Globalization; - Happy Bird

3

你调用 Convert.ToDouble 的时候没有指定格式。你需要记住这一点:

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

等同于:

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

失败的是第一行,而不是第二行……在第一行中,它只会使用当前线程文化。

我建议您改用Double.Parse,并在那里指定格式。(您可以改用 Convert.ToDouble,但我通常更喜欢更具类型特定性的 Double.Parse 等调用。这意味着如果您移动到 TryParse 等,需要更改的内容会更少。)

如果确切数字很重要,您还应该考虑使用decimal代替double。例如,如果这是一个货币值,它在逻辑上更像是一个decimal 数字而不是一个double数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接