1. 概述
本篇教程将介绍 Kotlin 中将 String 转换为 Long 以及反向操作的几种常见方式。
2. 基础转换
要将一个 String 转换为 Long,我们可以使用 Kotlin 提供的扩展函数 toLong()
:
val number = "42".toLong()
assertEquals(42, number)
⚠️ 如果传入的字符串不是一个合法的数字,toLong()
会抛出 NumberFormatException
异常:
assertThrows<NumberFormatException> { "the answer is 42".toLong() }
与之相对,toLongOrNull()
在转换失败时不会抛异常,而是返回 null
:
val number: Long? = "42".toLongOrNull()
assertEquals(42, number)
assertNull("the answer is 42".toLongOrNull())
✅ 这个函数内部其实捕获了异常并返回 null,使用起来更安全。
3. 指定进制转换
除了十进制,我们还可以将其他进制(如十六进制、二进制、八进制)的字符串转换为 Long。只需要在调用时传入对应的进制基数(radix)即可:
assertEquals(15, "f".toLong(16))
assertEquals(15, "F".toLong(16))
assertEquals(15, "17".toLong(8))
assertEquals(15, "1111".toLongOrNull(2))
如果字符串在指定进制下不是合法数字,toLong(radix)
会抛异常,而 toLongOrNull(radix)
返回 null
:
assertThrows<NumberFormatException> { "fg".toLong(16) }
assertNull("8".toLongOrNull(8))
⚠️ 比如十六进制中不能包含字母 “g”,八进制中不能出现数字 “8”,否则就是非法输入。
4. 无符号 Long 转换
从 Kotlin 1.3 开始,Kotlin 引入了对无符号整数的支持(Unsigned Integers)。自然地,我们也可以将字符串转换为无符号的 ULong
类型:
assertEquals(42uL, "42".toULong())
同样支持指定进制:
assertEquals(15uL, "f".toULong(16))
API 与有符号类型保持一致:
assertEquals(15uL, "17".toULongOrNull(8))
assertNull("179".toULongOrNull(8))
assertThrows<NumberFormatException> { "179".toULong(8) }
⚠️ 由于无符号整数目前仍处于实验阶段,使用时需要加上注解 @ExperimentalUnsignedTypes
来抑制编译器警告。
5. Long 转 String
除了 String 转 Long,我们也可以反向操作,使用 toString()
方法将 Long 转换为 String:
assertEquals("42", 42.toString())
还可以指定进制来转换为不同进制的字符串:
assertEquals("101010", 42.toString(2))
assertEquals("2a", 42uL.toString(16))
✅ 上面的示例展示了如何把有符号和无符号的 Long 转换为二进制和十六进制字符串。
6. 总结
本文简要介绍了 Kotlin 中 String 与 Long 之间的相互转换方式,包括基础转换、进制转换以及对无符号整数的支持。
一如既往,文中所有示例代码都可以在 GitHub 项目 中找到。