我有一个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)是:ArgumentNullException
,FormatException
和OverflowException
。关于c# - Double未正确存储在MySQL数据库中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37037300/