输入字符串的格式不正确。 c#CultureInfo

时间:2014-09-05 13:58:34

标签: c# cultureinfo

VS:2005,框架:2.0

我有法语和英语的下拉列表。当用户选择语言时,我们将CultureInfo分别设置为fr-FR或en-US。

从DB中检索浮点值时,我们将值指定为

Convert.ToDecimal(table.Rows[0]["diametre"].ToString(), System.Globalization.CultureInfo.InvariantCulture)

在法语中,1.3显示为13或某个时间给出"输入字符串的格式不正确。"错误。我尝试了以下代码:

System.Globalization.NumberFormatInfo numberFormatInfo = new System.Globalization.NumberFormatInfo();
                if (System.Globalization.CultureInfo.CurrentCulture.Name == "fr-FR")
                    numberFormatInfo.NumberDecimalSeparator = ",";
                else
                    numberFormatInfo.NumberDecimalSeparator = ".";
Convert.ToDecimal(table.Rows[0]["densite"].ToString(), numberFormatInfo)

但是如上所述给出输入字符串错误。当" en-US"文化,它完美无缺!

我还应该尝试什么? 这给现在带来了很大的痛苦。请帮我。 TIA

更新: 谢谢大家,回复! 修复bug时我得到了同事的帮助。我们做了以下更改:

decimal diametre = Convert.ToDecimal(table.Rows[0]["diametre"].ToString().Replace(",", "."), new System.Globalization.CultureInfo("en-US"));

感谢Tim提供的有用信息,例如" ToString将使用当前文化的小数点分隔符"

4 个答案:

答案 0 :(得分:2)

为什么diametre一个string?如果它是数据库中的decimal,您应该使用:

decimal diametre = table.Rows[0].Field<decimal>("diametre");

这将更有效,也可以防止本地化问题。

否则,您可以将decimal.Parse与适当的culture-info:

一起使用
var french = new CultureInfo("fr-FR");
decimal diametre = decimal.Parse(table.Rows[0].Field<string>("diametre"), french);

更新我刚刚看到您使用的是.NET2,然后Field - 扩展方法不可用。你必须将它转换为正确的类型,我仍然不会使用ToString将所有内容转换为字符串,因为它可以修改它(如果它是小数,则为fe,ToString将使用当前文化的小数分隔符)。

decimal diametre = (decimal)table.Rows[0]["diametre"];

decimal diametre = decimal.Parse((string)table.Rows[0]["diametre"], french);

例如,如果它始终以点作为小数分隔符存储,例如en-US,则可以使用:

decimal diametre = decimal.Parse((string)table.Rows[0]["diametre"], CultureInfo.InvariantCulture);

如果您希望使用正确的格式显示它,请使用decimal.ToString

string output = diametre.ToString(french);

答案 1 :(得分:0)

基本上,你在.NET中有两种文化。

你有一种文化,你有一种UI文化。

文化会影响如何向用户显示与文化相关的数据(日期,货币,数字和其他信息)。 UI文化影响要使用的资源文件,因此首先,如果您只想更改语言,但保留日期格式和计算机上配置的其他信息,您应该只更改UI文化而不是文化

但是,上面给出的答案是有效的。

  • 如果字段是数字,请将其存储为数字而不是字符串。
  • 使用具有正确文化的Parse。

@Tim我给了你答案的分数,但我也想为此做出贡献。

答案 2 :(得分:0)

我知道这个问题已经过时了,但它可能有助于其他有同样问题的人,而上述解决方案都没有帮助他们。对我来说,将这行代码添加到我的应用程序的MainPage构造函数中(我使用的是xamarin.Forms),解决了这个问题。

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); 

希望它有所帮助,它只是将应用程序的文化设置为英语,无论设备文化/语言设置为什么,因此如果您需要应用程序在本地运行,那么这可能不是一个好的解决方案< / p>

答案 3 :(得分:-1)

您可以像这样首先转换dbValue:

string MyValue = (String)(table.Rows[0]["diametre"] == DBNull.Value ? string.Empty : table.Rows[0]["diametre"].ToString);

然后用点替换可能的逗号:

if(!string.isNullOrEmpty(MyValue)){
MyValue.Replace(",",".");
}

然后将其转换为十进制:

Convert.ToDecimal(MyValue, System.Globalization.CultureInfo.InvariantCulture)