Xamarin.iOS越南语环境下CLLocation经纬度返回带逗号非double格式值问题
区域本地化导致经纬度格式异常问题解答
问题本质
你遇到的是系统区域本地化规则导致的数字格式差异问题,不是Xamarin平台独有缺陷:全球有接近一半的语言/区域(包括越南语、法语、德语等)默认使用逗号作为小数分隔符,当你直接将数值类型转为字符串时,如果没有指定统一格式,系统会自动适配当前区域的规则,就会出现原本的小数点变成逗号的情况。
该问题在其他开发语言中是否存在
是,该问题在所有支持区域化格式的开发语言/平台中都会出现:
- Swift开发iOS应用时,如果直接调用
String(location.coordinate.latitude)做字符串拼接,系统切换到越南语后输出的经纬度也会是逗号分隔的格式 - 安卓端用Java/Kotlin开发、前端用JavaScript开发、后端用Python/Java开发时,只要使用默认区域规则格式化数字,都会出现相同问题
修复方案
Xamarin.iOS 修复代码
只需要在数值转字符串时指定使用不随系统变化的固定不变区域即可:
using System.Globalization; public void SendLocation(object sender, LocationUpdatedEventArgs e) { CLLocation location = e.Location; strUrl = "test.com/api/gps?token=1234"; strUrl += "&lati="; strUrl += location.Coordinate.Latitude.ToString(CultureInfo.InvariantCulture); strUrl += "&longi="; strUrl += location.Coordinate.Longitude.ToString(CultureInfo.InvariantCulture); strUrl += "&alti="; strUrl += location.Altitude.ToString(CultureInfo.InvariantCulture); }
Swift 对应修复示例
Swift中通过指定格式化器的固定区域保证输出格式统一:
import CoreLocation let location: CLLocation = // 获取到的位置对象 let formatter = NumberFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.numberStyle = .decimal formatter.maximumFractionDigits = 8 // 可根据接口要求调整保留的小数位数 guard let latStr = formatter.string(from: NSNumber(value: location.coordinate.latitude)), let longStr = formatter.string(from: NSNumber(value: location.coordinate.longitude)), let altStr = formatter.string(from: NSNumber(value: location.altitude)) else { // 格式化异常处理逻辑 return } let requestUrl = "test.com/api/gps?token=1234&lati=\(latStr)&longi=\(longStr)&alti=\(altStr)"
内容的提问来源于stack exchange,提问作者Ganghyeock Ji
相关产品推荐
相关产品推荐

