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将使用当前文化的小数点分隔符"
答案 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文化而不是文化
但是,上面给出的答案是有效的。
@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)