![](/img/trans.png)
[英]How do I pull an float value from a database table and assign it to a variable of type double in asp.net C#?
[英]How do I read a double column from MySQL and assign it to a C# double variable?
我在阅读我的数据库时遇到问题。 到目前为止,我确信当我从 MySQL 读取一些双精度时(它们存储为双精度而不是字符串/ varchar ),它们返回一个点作为小数分隔符。 (10.5)。 但现在我注意到,事实上,他们是在昏迷状态下返回的?
我最近创建了一个新表(一个月前),但刚才我注意到它的双精度值是用逗号,
不是点返回的.
.
我查了一下,这些表都在 uff8_unicode_ci 中。
我不明白,
因为我确定不能在 MySQL 中使用,也在那个链接上检查过。
注意:这可能是因为我使用了几台计算机进行测试,有些是法语的,有些是俄语的?
编辑:
要编辑表格,我执行以下操作:
string request = "UPDATE [vegasteel].consumables SET ID_MACHINE=" + this.idMachine + ",GROUPE="PLASMA",TYPE=\'\',DETAIL=\'14\',SPEED=10.5,TIME=5.5,COST=0.5 WHERE ID=" + this.id;
DataBase.Update(request);
然后阅读它:
if (this.OpenConnection() == true)
{
IDataReader dataReader = ExecuteReader(query);
while (dataReader.Read())
{
Consumable consumable = new Consumable();
consumable.ID = Convert.ToInt64(dataReader["ID"].ToString());
consumable.IdMachine = Convert.ToInt64(dataReader["ID_MACHINE"].ToString());
consumable.Groupe = dataReader["GROUPE"].ToString();
consumable.Type = dataReader["TYPE"].ToString();
consumable.Detail = dataReader["DETAIL"].ToString();
if(consumable.Groupe=="PLASMA")
{
string toto = "";
}
consumable.Speed = Global.ConvertToDouble(dataReader["SPEED"].ToString());
consumable.Time = Global.ConvertToDouble(dataReader["TIME"].ToString());
consumable.Cost = Global.ConvertToDouble(dataReader["COST"].ToString());
list.Add(consumable);
}
this.CloseConnection();
}
Global.ConvertToDouble
是一个 function 我为当前文化添加一个逗号或一个点。 但问题是当我阅读它时, dataReader["COST"] 等于0,5
,而不是0.5
编辑2:
如所问,这里是 Global.ConvertToDouble function,但正如我所解释的,问题是在 function 之前,因为逗号而不是点发送到 ZC1C425268E68385D1AB5074F141C
public static double ConvertToDouble(this string strToParse, char decimalSymbol = '.')
{
if (strToParse.Contains('E'))
{
strToParse = "0";
}
string tmp = Regex.Match(strToParse, @"([-]?[0-9]+)([\s])?([0-9]+)?[." + decimalSymbol + "]?([0-9 ]+)?([0-9]+)?").Value;
if (tmp.Length > 0 && strToParse.Contains(tmp))
{
var currDecSeparator = System.Windows.Forms.Application.CurrentCulture.NumberFormat.NumberDecimalSeparator;
tmp = tmp.Replace(".", currDecSeparator).Replace(decimalSymbol.ToString(), currDecSeparator);
return double.Parse(tmp);
}
return double.NegativeInfinity;
}
您不应该将列转换为字符串然后解析它们。 您应该直接阅读它们的类型。
consumable.Speed = (double) dataReader["SPEED"];
或者
consumable.Speed = Convert.ToDouble(dataReader["SPEED"]);
null
处理注意事项(感谢@mjwills 提到这一点)
The results from the db may contain null values and there are many ways of handling nulls in results with IDataReader
(you can see SQL Data Reader - handling Null column values or Null safe way to get values from an IDataReader or search the broader web).
例如,当返回值为 null 时,您需要决定是否需要null
或默认值( double
精度为 0)。
为了让您开始,这里有一个辅助方法(它可以很容易地更改为扩展方法,甚至可以使其成为通用方法,以便您可以处理int
和其他类型)。
public static double GetNotNullExample(IDataReader reader, string colName, double valueIfNull)
{
var colIndex = reader.GetOrdinal(colName);
if (!reader.IsDBNull(colIndex))
return reader.GetDouble(colIndex);
else
return valueIfNull;
}
重新安装计算机后,文化发生了变化。 以下代码段显示了区域性对ToString
方法的影响。
double pie = 3.14; // ;)
CultureInfo.CurrentCulture = new CultureInfo("en-US", false);
Console.WriteLine(pie.ToString());
Console.WriteLine(pie.ToString(CultureInfo.InvariantCulture));
CultureInfo.CurrentCulture = new CultureInfo("ru-RU", false);
Console.WriteLine(pie.ToString());
Console.WriteLine(pie.ToString(CultureInfo.InvariantCulture));
3.14
3.14
3,14
3.14
ToString()
然后解析不。
如果要继续 ToString()->Parse 方法,则必须确保使用InvariantCuture
调用 ToString。
consumable.Speed = Global.ConvertToDouble(dataReader["SPEED"]
.ToString(CultureInfo.InvariantCulture));
您需要检查 C# 中的语言环境。 (SQL 标准规定了一个点,并且 MySQL 遵守。)
获得一致 output 的一种简单方法是使用不变区域性。 大多数时候,文化可以作为转换方法的重载。
如果你分享Global.ConvertToDouble
方法,我们可以和你一起看看。
编辑
查看您的方法Global.ConvertToDouble
,我建议您删除该代码,因为尚不清楚它应该做什么。 用 0 代替E
听起来不合理。 为什么不只是做
Double myVar = 0;
Double.TryParse(dataReader["SPEED"], NumberStyles.Number, CultureInfo.InvariantCulture, out myVar);
return myVar;
编辑 2
要确保的另一件事是,当您将值作为字符串输出时,您应该执行myVar.ToString(CultureInfo.InvariantCulture)
,因此在将值转换为字符串时不会出现逗号.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.