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。