C# “字符串”;0.080“;加倍等于80.00

C# “字符串”;0.080“;加倍等于80.00,c#,mysql,string,parsing,double,C#,Mysql,String,Parsing,Double,我在c#中遇到了这个问题,我想将字符串转换为double textBoxKostOnderhoud.Text = "0.08"; kost.OnderhoudKost = double.Parse(textBoxKostOnderhoud.Text); 这在我的数据库中占了80.00,我不知道为什么。这个问题有什么解决办法吗 这就是我向数据库(mysql)添加值的方式 sql 我怀疑您使用的区域性小数分隔符为“”,分组分隔符为“” 您可以指定解析时要使用的区域性: double d = do

我在c#中遇到了这个问题,我想将字符串转换为double

textBoxKostOnderhoud.Text = "0.08";

kost.OnderhoudKost = double.Parse(textBoxKostOnderhoud.Text);
这在我的数据库中占了80.00,我不知道为什么。这个问题有什么解决办法吗

这就是我向数据库(mysql)添加值的方式

sql


我怀疑您使用的区域性小数分隔符为“”,分组分隔符为“”

您可以指定解析时要使用的区域性:

double d = double.Parse(s, CultureInfo.InvariantCulture);
这是否合适通常取决于上下文-字符串来自哪里?如果是用户,你知道他们的文化是什么吗?如果它不是来自用户,那么数据源是否具有固有的文本性,或者是否有一种方法可以在不进行任何字符串转换的情况下获取值

请注意,如果这是一个货币值,几乎可以肯定您应该使用
十进制
,而不是
双精度

编辑:现在您已经包含了SQL,我们可以看到值没有正确传播到数据库的原因:

// Note properly broken, but this is all on one line. (Ick to start with.)
string query = "INSERT INTO kost (wagenId, onderhoudKost, tolKost, 
   bedrijfsVerzekering, autoVerzekering, ladingVerzekering, wegenBelasting, 
   eurovignet, accountantKost, telefoonKost, documentenEnVergunningen, onvoorzien, 
   overige, andere) VALUES('" + kost.WagenId + "', '" + kost.OnderhoudKost + "', '" 
   + kost.TolKost + "', '" + kost.BedrijfsVerzekering + "', '" +
   kost.AutoVerzekering + "', '" + kost.LadingVerzekering + "', '" + 
   kost.WegenBelasting + "', '" + kost.Eurovignet + "', '" + kost.AccountantKost + 
   "', '" + kost.TelefoonKost + "', '" + kost.DocumentenEnVergunningen + "', '" + 
   kost.Onvoorzien + "', '" + kost.Overige + "', '" + kost.Andere + "')";
您正在将所有值转换为SQL中的字符串,并希望数据库能够以同样的方式再次解析它们。碰巧的是,由于您的默认文化,它不会再次出现

更重要的是,这里有一个巨大的攻击漏洞

不要这样做。改用参数化SQL,在SQL中放置占位符,然后分别指定参数值。好处:

  • 防止SQL注入攻击
  • 通过将代码(SQL)与数据分离,使SQL语句更加清晰
  • 减少你最终的转换次数,这样你就少了担心文化等问题的地方
请参阅您正在使用的MySQL驱动程序的文档,了解用于参数的确切格式(我相信根据驱动程序的不同,可能会有一些稍微不同的形式)-但从根本上说,这适用于所有数据库访问,与您交谈的任何数据库以及您使用的任何语言。

您可以在中使用忽略当前区域性:

double d = double.Parse(s, CultureInfo.InvariantCulture);


由于您正在连接字符串以创建SQL命令文本,因此您的
双d
可能会转换为字符串“0080”,MySql可能会将其解释为80。

请提供复制观察到的行为的完整代码示例。如何验证值为
80.00
?如果有“0080”怎么办?这可能是一个区域性问题,但我不确定,因为您没有提供太多信息。
“0080”
会产生另一个值,我想?如果您使用Convert.ToDouble方法?编辑:没关系,不起作用。我在MYSQL数据库中使用Double,如果我尝试0080,我会在db中得到0.000。哇。。我在发布1秒后看到一个upvote。这在我调试代码时起作用。该变量的值为0.08。但当我检查数据库时,它仍然有8个。00@Mankeeey:下一个问题可能是如何在数据库中存储值?我们不知道你的代码是什么样子的。(如果您没有使用参数化SQL,那很可能就是问题所在。)现在将代码包含到我的问题中。@Mankeey:对。正如我所想。不要那样做。我将编辑我的答案。很好。我至少要尝试在SQL字符串中去掉这个参数的引号。参数化SQL会更好。显示数据库中此字段的字段定义可能会有所帮助。
// Note properly broken, but this is all on one line. (Ick to start with.)
string query = "INSERT INTO kost (wagenId, onderhoudKost, tolKost, 
   bedrijfsVerzekering, autoVerzekering, ladingVerzekering, wegenBelasting, 
   eurovignet, accountantKost, telefoonKost, documentenEnVergunningen, onvoorzien, 
   overige, andere) VALUES('" + kost.WagenId + "', '" + kost.OnderhoudKost + "', '" 
   + kost.TolKost + "', '" + kost.BedrijfsVerzekering + "', '" +
   kost.AutoVerzekering + "', '" + kost.LadingVerzekering + "', '" + 
   kost.WegenBelasting + "', '" + kost.Eurovignet + "', '" + kost.AccountantKost + 
   "', '" + kost.TelefoonKost + "', '" + kost.DocumentenEnVergunningen + "', '" + 
   kost.Onvoorzien + "', '" + kost.Overige + "', '" + kost.Andere + "')";
double d = double.Parse(s, CultureInfo.InvariantCulture);
output:
0.08