字符串的魔力:为什么 Kotlin 中的格式化是一门艺术
想象一下:您正在编写一个运动训练追踪应用。需要输出一条消息:"你好,阿列克谢!您的成绩:42.5 公里,用时 2:15:07。最佳成绩提高了 3.2%。"。如果像 Java 风格那样用拼接(连接)来构建这样的字符串——代码将变成一堆加号和引号。 Kotlin 中的字符串格式化 优雅而强大地解决了这个问题。
在本文中,我们将探讨 Kotlin 字符串格式化 的 5 种方法。您将了解何时使用插值,何时使用老牌的 String.format(),以及何时使用高级模板。开始吧!
1. 字符串插值:Kotlin 的日常必备
最流行且最简单的技术是 Kotlin 中的字符串插值。它直接内置于语言中:使用美元符号 $ 插入变量,使用 ${} 插入表达式。
val name = "安娜"val age = 28val message = "我叫 $name,今年 $age 岁。"println(message) // 我叫 安娜,今年 28 岁。
// 带花括号的表达式val price = 49.99val discount = 0.2val finalPrice = "折扣价:${price * (1 - discount)} 卢布"println(finalPrice) // 折扣价:39.992 卢布优点: 可读性强,速度快,无需额外调用。 缺点: 无法控制数字格式(例如,小数位数)。
何时使用
- 简单的消息、日志、UI 文本
- 当不需要精确设置数字或日期格式时
- 在
println()或StringBuilder内部
2. String.format():Kotlin 中的 Java 遗产
如果需要控制格式——Kotlin 中的 String.format() 可以帮到您。这是直接通往 Java 方法 String.format() 的桥梁,使用相同的格式说明符(%s、%d、%.2f)。
val pi = 3.1415926535val formatted = String.format("圆周率 π 保留三位小数:%.3f", pi)println(formatted) // 圆周率 π 保留三位小数:3.142
// 多个参数val name = "伊万"val score = 95val result = String.format("%s 在 100 分中得了 %d 分", name, score)println(result) // 伊万 在 100 分中得了 95 分一个重要细节:Kotlin String.format 字符串格式化 不是类型安全的——如果传入了错误的类型,会在运行时抛出异常。要进行静态检查,请使用 Kotlin 特有的方法(参见第 5 节)。
3. MessageFormat:当需要带占位符的模板时
对于具有重复参数或本地化的复杂模板——Kotlin 中的 MessageFormat。它能够选择词形(单数/复数)并格式化日期。
import java.text.MessageFormat
val pattern = "在 {0} 那里有 {1} {0,choice,0#个苹果|1#个苹果|2#个苹果}。"val result = MessageFormat.format(pattern, "佩佳", 5)println(result) // 在 佩佳 那里有 5 个苹果。
// 带日期val datePattern = "今天是 {0,date,long}。时间:{0,time,short}"val now = java.util.Date()println(MessageFormat.format(datePattern, now))何时选择: 国际化 (i18n)、复杂的变格、包含 5 个以上参数的模板。 缺点: 语法冗长且依赖 java.text。
4. Kotlin 扩展:简洁与类型安全
Kotlin 社区热衷于 用于字符串格式化的扩展。您可以自己编写一个简单的工具,或者使用现成的库(例如 kotlinx.string)。
// 最简单的扩展fun String.format(vararg args: Any?): String { return String.format(this, *args)}
// 使用val template = "你好,%s!你的余额:%.2f USD"val msg = template.format("马克西姆", 1234.5678)println(msg) // 你好,马克西姆!你的余额:1234.57 USD