1. 概述

在本教程中,我们将探讨如何在 Kotlin 中对数字进行填充操作。填充数字在格式化输出、日志记录或数据库对齐等场景中非常常见。

2. 问题背景

当我们说“填充数字”时,通常有两种常见需求:

  • 左填充(前导填充):比如在数字前面补零,使所有数字长度一致
  • 右填充(尾随填充):比如在数字后面补空格,用于对齐输出

为了更直观,我们来看一组示例数据:

val inputNumbers = listOf(7, 42, 4200, 42000, 420000)

2.1 左填充需求

要求所有长度小于 5 的数字前面补零,使其总长度为 5:

val expectedPadStart = listOf("00007", "00042", "04200", "42000", "420000")

2.2 右填充需求

要求所有长度小于 5 的数字后面补空格,使其总长度为 5:

val expectedPadEnd = listOf("7    ", "42   ", "4200 ", "42000", "420000")

我们不打算引入第三方库,而是专注于使用 Kotlin 标准库来完成这些任务。


3. 使用 String.format() 方法填充数字

在 Java 中,我们可以使用 String.format() 来填充字符串。Kotlin 同样支持这个方法,它是一个扩展函数,内部调用的是 Java 的 String.format()

public inline fun String.format(vararg args: Any?): String = java.lang.String.format(this, *args)

我们可以通过构建格式字符串来实现填充:

inputNumbers.map { "%05d".format(it) }.let {
    assertThat(it).isEqualTo(expectedPadStart)
}

inputNumbers.map { "%-5d".format(it) }.let {
    assertThat(it).isEqualTo(expectedPadEnd)
}
  • "%05d":表示左填充 0,总长度为 5
  • "%-5d":表示右填充空格,总长度为 5

✅ 优点:简洁、语法统一
❌ 缺点:只能使用空格或 0 作为填充字符(由 Java 的 Formatter 内部决定)

⚠️ 如果需要使用其他字符填充(如 #),需要先填充空格再替换:

inputNumbers.map { "%-5d".format(it).replace(" ", "#") }.let {
    assertThat(it).isEqualTo(listOf("7####", "42###", "4200#", "42000", "420000"))
}

4. 使用 padStart()padEnd() 方法填充数字

Kotlin 提供了两个非常方便的字符串扩展方法:

这两个方法接受两个参数:

  • length:填充后的目标长度
  • padChar:用于填充的字符

4.1 左填充示例

inputNumbers.map { "$it".padStart(5, '0') }.let {
    assertThat(it).isEqualTo(expectedPadStart)
}

4.2 右填充示例

inputNumbers.map { "$it".padEnd(5, ' ') }.let {
    assertThat(it).isEqualTo(expectedPadEnd)
}

4.3 自定义填充字符

padStart()padEnd() 的最大优势在于支持自定义填充字符:

inputNumbers.map { "$it".padEnd(5, '_') }.let {
    assertThat(it).isEqualTo(listOf("7____", "42___", "4200_", "42000", "420000"))
}

✅ 优点:

  • 更直观、更易读
  • 支持任意字符填充

5. 总结

我们通过两个实际需求,学习了如何在 Kotlin 中对数字进行填充操作。

方法 支持填充字符 是否推荐 说明
String.format() ❌ 仅支持 0 和空格 ✅ 简洁,但灵活性差
padStart() / padEnd() ✅ 支持任意字符 ✅ 推荐使用,更直观、更灵活

如果你只是想做简单的补零或补空格操作,String.format() 是一个快速方案;但如果需要更灵活的填充(如用 #_ 等字符),推荐使用 padStart()padEnd() 方法

完整代码示例请参考 GitHub


原始标题:Pad a Number in Kotlin