【问题标题】:how to remove the thousand separator using cultureinfo?如何使用cultureinfo删除千位分隔符?
【发布时间】:2013-03-21 11:01:08
【问题描述】:

我尝试删除千位分隔符,因此我正在试验一些代码,但它会抛出异常。我试过Convert.ToDoubleConvert.ToDecimal等。

上面写着:

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

转换是从以下行引发的:Convert.ToDouble()

参数n2 使用了 culturinfo,但我也试过 "0.00" 都抛出相同的异常

整个想法是:如何删除千位分隔符,我的输入始终采用这种格式:1.234,54(逗号作为十进制,点作为千位分隔符)...我喜欢在 Textbox GotFocus Event 中使用它。所以格式应该显示为 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"))
  • 两行代码都给出相同的错误。

标签: c# winforms formatting string-formatting cultureinfo


【解决方案1】:

使用转换指定文化,它将像这样工作:

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

【讨论】:

  • 感谢这段代码对我有用。但它是如何工作的?因为 NL-be 有一个 DOT 的千位分隔符,所以它仍然应该显示点。?
  • "@ 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。请指教?
  • using System.Globalization;
【解决方案2】:

您对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 数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多