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
仍然是首选方案。