Kotlin 字符串模板与 String.format()
Kotlin 的字符串模板是一种强大的格式化字符串的工具,但它在处理数值打印时有一定的局限。这时就可以使用 String.format()
函数,它提供了更灵活的格式化方式。
基本语法与通用字符串格式说明符
在 Kotlin 中,String.format()
方法可以通过格式字符串和一组参数返回格式化后的字符串。例如:
val string = String.format("%s %s", "Hello", "World")
println(string)
// 输出:Hello World
解释:
-
"%s %s"
是格式字符串,其中%s
是格式说明符,代表字符串类型; -
每个
%s
对应一个后续参数,依次被"Hello"
和"World"
替换; -
%s
(小写)或%S
(大写)都可以用来插入字符串参数。
可选语法
val string = "%s %s".format("Hello", "World")
println(string)
// 输出:Hello World
解释:
Kotlin 允许将 format()
直接调用在字符串上,作用相同。
使用 %S
输出大写字符串:
val string = String.format("%S %S", "Hello", "World")
println(string)
// 输出:HELLO WORLD
参数顺序与转义符
可以通过 %n$
来改变参数顺序,例如:
val str1 = "Kotlin"
val str2 = "the best language"
var str = String.format("%1\$s is %2\$s", str1, str2)
println(str) // 输出:Kotlin is the best language
str = String.format("%2\$s is %1\$s", str1, str2)
println(str) // 输出:the best language is Kotlin
**注意:**由于 $
是 Kotlin 的模板语法符号,需要使用 \$
进行转义。
特殊格式说明符
-
%%
:插入%
符号; -
%n
:插入换行(依系统不同可能是\r\n
或\n
); -
建议使用
\n
获取更可控的行为。
println(String.format("The percentage of%nthis amount is 30%%.\nIt is easy to remember."))
输出:
The percentage of
this amount is 30%.
It is easy to remember.
宽度与对齐
默认字符串右对齐,如:
val str = "string"
for (n in 1..15) println("%${n}s".format(str))
输出:
string
string
string
...
左对齐示例:
val s1 = String.format("%8s %8s", "Hello", "World")
println(s1) // Hello World
val s2 = String.format("%-8s %-8s", "Hello", "World")
println(s2) // Hello World
整数格式化(%d)
val int1 = 1234
val int2 = -4567
println(String.format("%d", int1)) // 1234
println(String.format("%8d", int1)) // 1234
println(String.format("%-8d", int1)) // 1234
println(String.format("%+d", int1)) // +1234
println(String.format("%+d", int2)) // -4567
println(String.format("%09d", int1)) // 000001234
println(String.format("%,10d", int1)) // 1,234
println(String.format("%+,010d", int1)) // +00001,234
println(String.format("%-+,10d", int1)) // +1,234
println(String.format("% d", int1)) // 1234
println(String.format("% d", int2)) // -4567
println(String.format("%(d", int2)) // (4567)
八进制与十六进制格式化(%o、%x、%X)
val int1 = 3465
val int2 = -7896
println(String.format("%o", int1)) // 6611
println(String.format("%o", int2)) // 37777760450
println(String.format("%#o", int1)) // 06611
println(String.format("%x", int1)) // d89
println(String.format("%X", int2)) // FFFFE128
println(String.format("%#X", int1)) // 0XD89
浮点数格式化(%f)
val double1 = 1234.5678
val double2 = -1234.5678
println(String.format("%f", double1)) // 1234.567800
println(String.format("%+f", double1)) // +1234.567800
println(String.format("%,f", double1)) // 1,234.567800
println(String.format("%15.2f", double1)) // 1234.57
println(String.format("%.3f", double1)) // 1234.568
科学计数法(%e、%E)
println(String.format("%e", double1)) // 1.234568e+03
println(String.format("%E", double2)) // -1.234568E+03
println(String.format("%.9E", double1)) // 1.234567800E+03
自动选择简洁表示(%g、%G)
val double1 = 1000.0
val double2 = 10000000.0
println(String.format("%g", double1)) // 1000.00
println(String.format("%g", double2)) // 1.00000e+07
布尔值与字符
val boolean = true
println(String.format("%b", boolean)) // true
println(String.format("%B", boolean)) // TRUE
val char = 'a'
println(String.format("%c", char)) // a
println(String.format("%C", char)) // A
格式说明符总结表
格式说明符 | 参数类型 | 输出格式 |
---|---|---|
%s | 任意类型 | 字符串表示 |
%d | 整数类型 | 十进制整数 |
%o / %#o | 整数类型 | 八进制(可带前缀 0) |
%x / %X | 整数类型 | 十六进制 |
%f | 浮点类型 | 十进制浮点 |
%e / %E | 浮点类型 | 科学记数法 |
%g / %G | 浮点类型 | 自动选择最短形式 |
%b / %B | Boolean | 布尔值 |
%c / %C | Char | 字符 |
%n | - | 换行符 |
%% | - | 百分号 % |