地图距离计算触发NumberFormatException的非捕获式修复方案咨询
修复地图距离计算中的NumberFormatException问题
问题根源
问题出在你的Double.round函数里:String.format默认会跟随设备的系统区域设置,部分地区(如欧洲部分国家)会用逗号作为小数点分隔符,而toDouble()解析时遇到逗号就会触发NumberFormatException。更新Kotlin版本后,相关API的区域依赖逻辑可能更严格,导致之前隐藏的问题暴露出来。
修复方案(无需try-catch)
方案1:格式化时指定固定区域(推荐)
在String.format中传入Locale.US,强制使用点作为小数点分隔符,确保生成的字符串格式统一:
import java.util.Locale fun Double.round(decimals: Int = 2): Double { return String.format(Locale.US, "%.${decimals}f", this).toDouble() }
方案2:使用DecimalFormat精确控制格式
用DecimalFormat配合指定区域的符号集,更灵活地控制格式化规则:
import java.text.DecimalFormat import java.util.Locale fun Double.round(decimals: Int = 2): Double { val decimalSymbols = DecimalFormatSymbols(Locale.US) val pattern = "#.${"#".repeat(decimals)}" val df = DecimalFormat(pattern, decimalSymbols) return df.format(this).toDouble() }
方案3:纯数学方式实现四舍五入(完全规避字符串转换)
跳过字符串格式化环节,直接用数学计算完成四舍五入,彻底避免区域问题:
fun Double.round(decimals: Int = 2): Double { val multiplier = 10.0.pow(decimals) return kotlin.math.round(this * multiplier) / multiplier }
优化建议
其实在显示距离的环节,你可以直接格式化原始数值,省去中间round后再转字符串的步骤,进一步减少出错可能:
fun updateDistance(){ val rawDistance = activity.currentLocation?.let { ll -> item.center.distanceTo(ll) } val formatted = rawDistance?.let { if (it < 1000) { String.format(Locale.US, "%.2f m", it) } else { String.format(Locale.US, "%.2f km", it / 1000) } } distanceTxt.text = formatted ?: "" }
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

