我有一个MVC应用程序,该应用程序具有可更新数据库的纬度和经度的静态服务。我将值作为字符串发送到API,并在将其存储为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;
}
当它存储在数据库中时,我缺少小数点。例如:
53.345634存储为53345634
我正在Windows 2012上运行的开发环境上进行此工作。但是,当将其移至Windows 2008生产服务器时,我看到了此问题。
指定正确的IFormatProvider / CultureInfo
您观察到的行为可能是由于两台计算机具有不同的CurrentCulture
s引起的。默认值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"));
解析方法使用区域性特定的小数点符号和组分隔符符号。在某些语言(例如英语)中,小数点符号是点,而在其他语言(例如波兰语中)则是逗号。组分隔符在各种语言中也有所不同。
如果53.345634
被解析为53345634
,则您的计算机使用一种文化,其中点是组分隔符。
解析与TryParse
你也应该考虑是否采用Parse
的TryParse
方法是比较合适的。
如果在正常运行期间您的程序预期输出无效(例如,它是用户提供的值),则绝对应使用TryParse
并检查返回的值。TryParse
返回一个布尔值,指示解析是否成功并且没有引发异常。
如果您要解析的值永远不会出错(例如,您正在解析与程序绑定的资源),则可以使用Parse
。如果您有某种方法可以恢复用户或向用户提供其他信息,则可以捕获适当的异常。根据文件可能的例外是:ArgumentNullException
,FormatException
和OverflowException
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句