我有一个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;
}

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



我正在Windows 2012上运行的开发环境上工作。但是,当将其移至Windows 2008生产服务器时,我看到了此问题。

最佳答案

指定正确的IFormatProvider/CultureInfo

您观察到的行为可能是由于两台计算机具有不同的 CurrentCulture 的事实引起的。 CurrentCulture的默认值取决于Windows的版本。

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

// using System.Globalization;
double value = Double.Parse(stringValue, CultureInfo.InvariantCulture);

或者
double valueUsEnglish = Double.Parse(stringValue, new CultureInfo("en-US"));

Parse方法使用区域性特定的小数点符号和组分隔符。在某些语言(例如英语)中,小数点符号是点,而在其他语言(例如波兰语中)则是逗号。组分隔符在各种语言中也有所不同。

如果将53.345634解析为53345634,则您的计算机使用的文化是,点是组分隔符。

解析vs TryParse

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

如果在正常操作期间您的程序预期输出无效(例如,它是用户提供的值),则绝对应使用TryParse并检查返回的值。 TryParse返回一个 bool 值,指示解析是否成功并且没有引发异常。

如果解析的值永远不会出错(例如,您解析的是与程序绑定(bind)的资源),则可以使用Parse。如果您有某种方法可以恢复用户或向用户提供其他信息,则可以捕获适当的异常。根据文档,可能的异常(exception)是:ArgumentNullExceptionFormatExceptionOverflowException

关于c# - Double未正确存储在MySQL数据库中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37037300/

10-12 13:04