1. 概述
在字符串或数值中统计数字位数是一个常见的编程任务。实现时需要注意避免误统计和运行时错误。
本文将介绍几种使用 Kotlin 实现统计数字位数的方法,包括字符串处理、正则表达式和数学运算等方式。适用于不同场景下的需求,帮助你选择最合适的实现方式。
2. 实现方式
根据输入数据类型的不同(字符串或整数),我们可以采用不同的策略进行处理。以下分别介绍几种常见方式。
2.1. 对字符串统计数字位数
将输入统一视为字符串处理是一种通用且灵活的方式。Kotlin 中的 Char
类型提供了 isDigit()
方法,可以判断某个字符是否为数字。
我们可以通过扩展 CharSequence
来实现一个通用的计数方法:
fun CharSequence.countDigits(): Int = count { it.isDigit() }
✅ 示例测试:
@Test
fun `given a value when counting digits then number of digits should be returned`() {
val number = 12345
assertThat(number.toString().countDigits()).isNotNull().isEqualTo(5)
}
如果你希望自定义判断逻辑,也可以手动定义数字字符集:
fun CharSequence.countDigitsCustom(): Int = when(this) {
"" -> 0
else -> this.count { it in ("0123456789") }
}
✅ 支持负数测试:
@Test
fun `given a negative value when counting digits then number of digits should be returned`() {
val number = -1234509
assertThat(number.toString().countDigitsCustom()).isNotNull().isEqualTo(7)
}
2.2. 使用正则表达式统计数字位数
Kotlin 支持通过正则表达式来匹配字符串中的数字字符,这种方式适用于更复杂的输入格式,比如浮点数、带符号数等。
fun CharSequence.countDigitsRegex(): Int = Regex("\\d").findAll(this).count()
✅ 测试浮点数输入:
@Test
fun `given a double value when counting digits then number of digits should be returned`() {
val number = 1234.509
assertThat(number.toString().countDigitsRegex()).isNotNull().isEqualTo(7)
}
⚠️ 注意:正则 \d
匹配的是所有 Unicode 中的数字字符,不局限于 ASCII 数字,使用时需注意输入格式是否符合预期。
2.3. 对整数使用数学公式统计位数
如果输入是整数类型,我们可以使用数学方法来计算其位数。一个常用的方法是利用以 10 为底的对数:
log10(n)
的结果向下取整再加 1,就是该整数的位数。
代码实现如下:
fun Int.countDigits() = when (this) {
0 -> 1
else -> log10(abs(toDouble())).toInt() + 1
}
这个方法适用于正整数和负整数(通过 abs()
取绝对值处理),并且对 0
做了单独处理。
3. 总结
本文介绍了几种使用 Kotlin 统计数字位数的实现方式:
- ✅ 字符串处理:适用于任意格式的输入,使用
isDigit()
或自定义字符集; - ✅ 正则表达式:灵活处理复杂格式,如浮点数、带符号数;
- ✅ 数学公式:适用于整数类型,效率高,逻辑简洁。
不同方法各有优劣,选择哪种方式取决于你的具体场景。例如:
- 如果输入是字符串形式,推荐使用
isDigit()
或正则; - 如果输入是整数,推荐使用对数方法,效率更高。
完整代码请参考:GitHub 示例仓库