1. 概述
在 Kotlin 开发中,将字符串(String)转换为整数(Int)是一个常见操作。本文将介绍几种常用的转换方法,帮你避免踩坑,写出更健壮的代码。
2. String 转 Int 的常用方式
最直接的方式是使用 Kotlin 标准库提供的 toInt()
扩展函数,它能将合法数字字符串转为对应的 Int
值:
val intValue = "42".toInt()
assertEquals(42, intValue)
✅ 适用场景:你完全确定字符串是合法整数时使用。
⚠️ 风险提示:如果字符串内容不合法,toInt()
会直接抛出 NumberFormatException
,导致程序中断。例如以下几种情况都会触发异常:
assertThrows<NumberFormatException> { "0x2a".toInt() } // 十六进制格式(非默认)
assertThrows<NumberFormatException> { "2.5".toInt() } // 含小数点
assertThrows<NumberFormatException> { "2.5 inch".toInt() } // 含非数字字符
assertThrows<NumberFormatException> { "invalid".toInt() } // 完全非法
❌ 踩坑提醒:不要在用户输入或外部接口返回值上直接调用 toInt()
,否则很容易引发线上异常。
2.1 使用 toIntOrNull 避免异常
为了更安全地处理不可信输入,推荐使用 toIntOrNull()
—— 它在转换失败时返回 null
而不是抛异常:
assertNull("invalid".toIntOrNull())
assertEquals(42, "42".toIntOrNull())
✅ 这种方式更适合实际业务场景,配合 Kotlin 的空安全机制,可以优雅地处理错误情况:
val input = getUserInput()
val number = input.toIntOrNull()
if (number != null) {
println("有效数字: $number")
} else {
println("输入无效,请输入一个整数")
}
2.2 支持不同进制(Radix)的转换
有时候我们需要处理非十进制的字符串,比如十六进制、二进制等。toInt()
和 toIntOrNull()
都支持传入 radix 参数指定进制:
val intValue = "2a".toInt(16) // 十六进制转十进制
assertEquals(42, intValue)
同样地,toIntOrNull()
也支持 radix:
assertEquals(42, "2a".toUIntOrNull(16))
assertNull("invalid_hex".toUIntOrNull(16))
常见 radix 取值:
- 2:二进制
- 8:八进制
- 10:十进制(默认)
- 16:十六进制
2.3 处理无符号整数(Unsigned Integers)
从 Kotlin 1.3 开始引入了对无符号类型的支持,如 UInt
、ULong
等。如果你需要处理无符号整数,可以使用对应的转换函数:
assertEquals(42u, "42".toUInt()) // 十进制
assertEquals(42u, "2a".toUInt(16)) // 十六进制
assertNull("2a".toUIntOrNull()) // 缺少 radix,解析失败
assertEquals(42u, "2a".toUIntOrNull(16)) // 正确指定 radix
📌 注意事项:
- 对应函数为
toUInt()
和toUIntOrNull()
- 无符号类型在 Kotlin 1.5+ 已为稳定功能
- 若使用早期版本(<1.5),需添加
@ExperimentalUnsignedTypes
注解启用实验特性 ⚠️
3. 总结
方法 | 行为 | 推荐使用场景 |
---|---|---|
toInt() |
失败抛异常 | 输入绝对可信时 |
toIntOrNull() |
失败返回 null | 处理用户输入、API 数据等 |
toInt(radix) |
支持指定进制,失败抛异常 | 明确进制且数据可信 |
toIntOrNull(radix) |
支持指定进制,失败返回 null | 最通用、最安全的选择 ✅ |
📌 最佳实践建议:
- 默认优先使用
toIntOrNull()
+ 空安全处理 - 处理进制转换时务必传入正确的 radix
- 对于无符号类型,注意版本兼容性和注解要求
所有示例代码均可在 GitHub 获取:https://github.com/Baeldung/kotlin-tutorials/tree/master/core-kotlin-modules/core-kotlin-strings