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 开始引入了对无符号类型的支持,如 UIntULong 等。如果你需要处理无符号整数,可以使用对应的转换函数:

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


原始标题:Converting String to Int in Kotlin