1. 简介

在处理以字符串形式表示的数字时,我们通常需要将其转换为数值类型以便进行后续计算。但当这些字符串中使用了千位分隔符(如逗号 , 或句点 .)时,转换就变得复杂了。

Kotlin 提供了多种方式来解析这类字符串。本文将介绍几种常见的方法,帮助你在不同场景下高效地处理带千位分隔符的数字字符串。


2. DecimalFormatSymbols

在解析过程中,我们首先需要获取当前 Locale 对应的千位分隔符符号。这可以通过 Java 标准库中的 DecimalFormatSymbols 类实现:

DecimalFormatSymbols.getInstance(Locale.getDefault()).groupingSeparator

这个方法会返回当前系统语言环境下的千位分隔符字符。

我们以两个常用 Locale 为例:

  • Locale.US:千分位使用逗号(,
  • Locale.GERMANY:千分位使用句点(.

3. 使用 replace() 方法配合正则表达式

一种简单直接的方法是利用 Kotlin 的 String.replace() 方法和正则表达式,将字符串中的千位分隔符移除

fun parseStringUsingReplace(input: String, locale: Locale): Int {
    val separator = DecimalFormatSymbols.getInstance(locale).groupingSeparator
    return input.replace(Regex("[$separator]"), "").toInt()
}

✅ 优点:代码简洁,易于理解
❌ 缺点:如果格式不规范或包含其他符号,可能会出错

✅ 单元测试示例:

@Test
fun `parses string with thousands separator using replace method`() {
    val result1 = parseStringUsingReplace("1,000", Locale.US)
    val result2 = parseStringUsingReplace("25.750", Locale.GERMANY)

    assertEquals(1000, result1)
    assertEquals(25750, result2)
}

4. 使用 StringTokenizer

另一种方法是使用 Java 提供的 StringTokenizer 类。它可以根据指定的分隔符将字符串拆分成多个 token,然后我们再将这些 token 拼接成一个完整的数字字符串:

fun parseStringUsingTokenizer(input: String, locale: Locale): Int {
    val separator = DecimalFormatSymbols.getInstance(locale).groupingSeparator
    val tokenizer = StringTokenizer(input, separator.toString())
    val builder = StringBuilder()
    while (tokenizer.hasMoreTokens()) {
        builder.append(tokenizer.nextToken())
    }
    return builder.toString().toInt()
}

✅ 优点:逻辑清晰,适合初学者理解
❌ 缺点:依赖 Java 类库,不是纯 Kotlin 实现

✅ 单元测试示例:

@Test
fun `parses string with thousands separator using string tokenizer`() {
    val result1 = parseStringUsingTokenizer("1,000", Locale.US)
    val result2 = parseStringUsingTokenizer("25.750", Locale.GERMANY)

    assertEquals(1000, result1)
    assertEquals(25750, result2)
}

5. 使用 NumberFormat

最推荐的方式是使用 Java 提供的 NumberFormat 类。它可以直接根据 Locale 解析带格式的字符串,自动识别千位分隔符和小数点符号:

fun parseStringWithSeparatorUsingNumberFormat(input: String, locale: Locale): Int {
    val number = NumberFormat.getInstance(locale)
    val num = number.parse(input)
    return num.toInt()
}

✅ 优点:最安全、最标准的方式,支持多种数字格式
❌ 缺点:返回的是 Number 类型,需手动转换

✅ 单元测试示例:

@Test
fun `parses string with thousands separator using number format class`() {
    val result1 = parseStringWithSeparatorUsingNumberFormat("1,000", Locale.US)
    val result2 = parseStringWithSeparatorUsingNumberFormat("25.750", Locale.GERMANY)

    assertEquals(1000, result1)
    assertEquals(25750, result2)
}

6. 总结

本文介绍了三种在 Kotlin 中解析带千位分隔符字符串的方法:

方法 优点 缺点
replace() + 正则 简洁明了 容易出错,不适用于复杂格式
StringTokenizer 逻辑清晰 依赖 Java 类库
NumberFormat 安全可靠,支持多语言环境 需要类型转换

✅ **推荐使用 NumberFormat**:它是最标准、最稳定的方式,尤其适用于国际化场景。

⚠️ 注意:在实际开发中,务必考虑异常处理(如输入格式错误、空字符串等),避免程序崩溃。

如果你希望支持更多语言环境或处理小数,NumberFormat 仍然是首选方案。


原始标题:Parse String With Thousands Separator in Kotlin

« 上一篇: KotlinPoet 介绍