Double未在MySQL数据库中正确存储

Zac*_*ach 5 c# mysql

我有一个MVC应用程序,它有一个宁静的服务,可以更新数据库的纬度和经度.我将值作为字符串发送到API,并在将其作为Double存储在数据库中之前将其转换为Double.这是我用来将字符串转换为double的代码:

Double _latitude, _longitude;
try
{
     Double.TryParse(lattitude, NumberStyles.Any,CultureInfo.CurrentCulture, out _latitude);
     Double.TryParse(Longtitude, NumberStyles.Any,CultureInfo.CurrentCulture, out _longitude);
}
catch(Exception e)
{
     _latitude = 0;
     _longitude = 0;
}
Run Code Online (Sandbox Code Playgroud)

当它存储在数据库中时,我缺少小数点.例如:

53.345634存储为53345634

我有这个工作在Windows 2012上运行的开发环境.但当它转移到Windows 2008生产服务器时,我看到了这个问题.

Tom*_*ski 3

指定正确的 IFormatProvider/CultureInfo

您观察到的行为可能是由于两台机器具有不同的CurrentCultures. 默认值CurrentCulture取决于 Windows 版本。

为了在不同的机器上获得一致的结果,您应该为 Parse 或 TryParse 方法提供特定的CultureInfo(或任何其他类实现),例如IFormatProvider

// using System.Globalization;
double value = Double.Parse(stringValue, CultureInfo.InvariantCulture); 
Run Code Online (Sandbox Code Playgroud)

或者

double valueUsEnglish = Double.Parse(stringValue, new CultureInfo("en-US"));
Run Code Online (Sandbox Code Playgroud)

解析方法使用特定于区域性的小数点符号组分隔符符号。在某些语言中(例如英语)小数点符号是点,而在其他语言中(例如波兰语)它是逗号。不同语言中的组分隔符符号也不同。

如果53.345634被解析为53345634,则您的计算机使用的区域性中,点是组分隔符。

解析与尝试解析

您还应该考虑使用ParseofTryParse方法是否更合适。

如果在正常操作期间您的程序期望无效输出(例如用户提供的值),那么您绝对应该使用TryParse并检查返回值。TryParse返回一个布尔值,指示解析是否成功并且不会抛出异常。

如果您正在解析的值永远不会错误(例如您正在解析与程序绑定的资源),您可以使用Parse. 如果您有某种方法来恢复或向用户提供一些附加信息,则可以捕获适当的异常。根据文档,可能的例外是:ArgumentNullExceptionFormatExceptionOverflowException