繁体   English   中英

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

[英]input string was not in a correct format. c# CultureInfo

VS:2005,框架:2.0

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

当从数据库中检索浮点值时,我们将值赋为

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

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

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

感谢Tim提供有用的信息,例如“ ToString将使用当前区域性的小数点分隔符

为什么diametrestring 如果数据库中为decimal ,则应使用:

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

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

否则,您可以使用decimal.Parse和相应的区域性信息:

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

更新我只看到您正在使用.NET2,那么Field -extension方法不可用。 您必须将其转换为正确的类型,我仍然不会使用ToString将所有内容都转换为字符串,因为那样可以修改它(例如,如果是十进制,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);

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

您有一种文化,也有一种UI文化。

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

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

  • 如果该字段是数字,则将其存储为数字而不是字符串。
  • 使用具有正确区域性的Parse。

@Tim我为您的回答提供了功劳,但我也想为此做出贡献。

我知道这个问题很旧,但可能会帮助遇到相同问题的其他人,上述解决方案都无法帮助他们。 对我来说,将这行代码添加到我的应用程序的MainPage构造函数中(我正在使用xamarin.Forms),解决了该问题。

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

希望对您有所帮助,它只是将应用程序的区域性设置为英语,而与设备的区域性/语言设置无关,因此,如果您需要使应用程序在本地运行,那么这可能不是一个好的解决方案

您可以先转换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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM