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 中 StringLong 之间的相互转换方式,包括基础转换、进制转换以及对无符号整数的支持。

一如既往,文中所有示例代码都可以在 GitHub 项目 中找到。


原始标题:String to Long Conversions in Kotlin