nvarchar转double遇格式异常及经纬度空值问题咨询
解决NVARCHAR转Double时的FormatException问题
嘿,我来帮你搞定这个经纬度转换的异常问题!你遇到的System.FormatException主要有两个核心诱因:一是数据库里的longitude/latitude字段是空值,或者包含了非数字的无效内容;二是字符串的格式和服务器的区域设置不匹配(比如有的地区用逗号当小数点,而你的数据里是点,反过来也会出问题)。而且空值确实会直接触发这个异常,因为double.Parse根本没法解析空字符串。
下面是具体的解决办法,一步步来:
1. 用double.TryParse替代double.Parse,优雅处理异常场景
Parse方法遇到搞不定的字符串就直接抛异常,太激进了;而TryParse会返回一个布尔值告诉你转换成没成功,同时通过输出参数给你转换后的值。这样你就能从容处理空值或者格式错误的情况:
foreach (var item in DynamicMapMarkers) { DonatorUserViewModel MapMarkers = new DonatorUserViewModel(); MapMarkers.NpoID = item.npo_id; MapMarkers.NpoName = item.npo_name; MapMarkers.NpoType = item.tblNpo_Type.description; MapMarkers.VerificationStatus = item.tblVerification.description; // 处理经度转换 if (double.TryParse(item.longitude, out double parsedLongitude)) { MapMarkers.Longitude = parsedLongitude; } else { // 转换失败时给个默认值,比如0,或者根据你的业务逻辑处理 MapMarkers.Longitude = 0; // 这里还可以加个日志记录,方便排查问题:比如 $"解析经度失败,NPO ID:{item.npo_id},原始值:{item.longitude}" } // 处理纬度转换 if (double.TryParse(item.latitude, out double parsedLatitude)) { MapMarkers.Latitude = parsedLatitude; } else { MapMarkers.Latitude = 0; // 同样可以记录错误日志 } MapMarkerList.Add(MapMarkers); }
2. 解决区域设置不匹配的坑
如果你的数据库里的数字格式是固定的(比如一直用点作为小数点),但服务器的区域设置用的是逗号,那你可以指定CultureInfo.InvariantCulture来强制用固定格式解析,不受区域影响:
// 示例:使用固定区域解析,需要先引入using System.Globalization; if (double.TryParse(item.longitude, NumberStyles.Float, CultureInfo.InvariantCulture, out double parsedLongitude)) { MapMarkers.Longitude = parsedLongitude; }
3. 提前过滤无效数据(可选优化)
如果你想在查询数据库的时候就把空值或者明显无效的经纬度排除掉,可以给LINQ查询加个过滤条件:
var DynamicMapMarkers = db.tblNpo .Include(zz => zz.tblVerification) .Include(xx => xx.tblNpo_Type) .Where(x => !string.IsNullOrEmpty(x.longitude) && !string.IsNullOrEmpty(x.latitude));
不过就算加了这个过滤,还是建议保留TryParse的处理,毕竟难保数据库里会混入像"abc"这种完全不是数字的字符串。
总的来说,核心就是用TryParse替代Parse来避免异常,同时处理好区域设置和空值的情况,这样就能解决你遇到的格式异常问题啦!
内容的提问来源于stack exchange,提问作者SeventhWarhawk
相关产品推荐
相关产品推荐

