You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

地图距离计算触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:40:33