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 示例仓库


原始标题:Count Number of Digits With Kotlin