如何在Kotlin中将字符串转换为长整型?

223
所以,由于缺乏像Long.valueOf(String s)这样的方法,我陷入了困境。
在Kotlin中如何将String转换为Long
12个回答

233

1. string.toLong()

将字符串解析为 [Long] 数字并返回结果。

@throws 若字符串不是数字的有效表示,则抛出 NumberFormatException 异常。

2. string.toLongOrNull()

将字符串解析为 [Long] 数字并返回结果,如果字符串不是数字的有效表示,则返回 null

3. string.toLong(10)

将字符串解析为 [Long] 数字并返回结果。

@throws 若字符串不是数字的有效表示,则抛出 NumberFormatException 异常。 @throws 若 [radix] 不是一个用于字符串转数字的有效进制,则抛出 IllegalArgumentException 异常。

public inline fun String.toLong(radix: Int): Long = java.lang.Long.parseLong(this, checkRadix(radix))

4. string.toLongOrNull(10)

将字符串解析为[Long]数字并返回结果,如果字符串不是数字的有效表示,则返回null

当[radix]不是用于字符串转数字的有效进制时,会抛出IllegalArgumentException异常。

public fun String.toLongOrNull(radix: Int): Long? {...}

5. java.lang.Long.valueOf(string)

public static Long valueOf(String s) throws NumberFormatException

110

String 有对应的扩展方法:

"10".toLong()

1
在 Kotlin 中,名称已经更改,您不需要担心何时或为什么更改,只需知道在 Kotlin 中所有 String 都有一个扩展函数 toLong() 以及 toInt() 和其他函数。您可以使用这些函数。也许 @ilya 可以更新此答案以适应当前的 Kotlin(删除 jet.String 引用)。 - Jayson Minard
提醒一下,如果你正在迭代一个数字字符串,它们将会是字符,[char].toInt() 将会给你 ASCII 表示。 - Peheje

61

4
如果你无法保证输入格式正确,那么str.toLongOrNull()和其他类似命名的方法也非常有用。使用它们,你可以执行像这样的操作:str.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number") - sotrh

10

注意:提到 jet.String 的答案已经过时了。下面是当前 Kotlin(1.0)的内容:

Kotlin 中的任何 String 已经有一个扩展函数,可以调用 toLong()。不需要特别处理,只需使用即可。

所有 String 的扩展函数 都有文档说明,您可以在 API 参考文档 中查找其他标准库的扩展函数。


8

实际上,在90%的情况下,您需要检查“长”是否有效,因此您需要:

"10".toLongOrNull()

每种基本类型的'toLong'都有一个相应的'orNull',这些可以与Kotlin习惯保持一致并处理无效情况。

同意。大多数情况下,.toLongOrNull() 就是你所需要的。 - Andrej

7

很有趣。像这样的代码:

val num = java.lang.Long.valueOf("2");
println(num);
println(num is kotlin.Long);

使其输出如下:
2
true

我猜 Kotlin 在这种情况下会自动将 java.lang.Long 和 long 原始类型转换为 kotlin.Long。所以,这是一种解决方案,但我希望看到不使用 java.lang 包的工具。

6
在Kotlin中,将String转换为表示64位有符号整数的Long非常简单。您可以使用以下任何示例:
val number1: Long = "789".toLong()
println(number1)                                   // 789

val number2: Long? = "404".toLongOrNull()
println("number = $number2")                       // number = 404

val number3: Long? = "Error404".toLongOrNull()    
println("number = $number3")                       // number = null

val number4: Long? = "111".toLongOrNull(2)         // binary
println("numberWithRadix(2) = $number4")           // numberWithRadix(2) = 7

使用toLongOrNull()方法后,您可以在?.安全调用运算符之后使用let { }作用域函数。这种逻辑对于仅在非空值时执行代码块很有用。
fun convertToLong(that: String) {
    that.toLongOrNull()?.let {
        println("Long value is $it")
    }
}
convertToLong("123")                               // Long value is 123

3

在答案中没有提到的一个好用的Java方法是java.lang.Long.decode(String)


十进制字符串:

Kotlin的String.toLong()等同于Java的Long.parseLong(String)

将字符串参数解析为有符号的十进制长整型。... 返回结果long值,就像参数和基数10作为参数传递给parseLong(java.lang.String, int)方法一样。


非十进制字符串:

Kotlin的String.toLong(radix: Int)等同于Java的eLong.parseLong(String, int)

将字符串参数解析为指定基数的有符号长整型。字符串中的字符必须全部是指定基数的数字...

这时就需要用到java.lang.Long.decode(String)方法:

将字符串解码为长整型。接受以下语法规则表示的十进制、十六进制和八进制数:DecodableString:

(Sign) DecimalNumeral | (Sign) 0x HexDigits | (Sign) 0X HexDigits | (Sign) # HexDigits | (Sign) 0 OctalDigits

Sign: - | +

这意味着decode可以解析像"0x412"这样的字符串,而其他方法会导致NumberFormatException

val kotlin_toLong010 = "010".toLong() // 10 as parsed as decimal
val kotlin_toLong10 = "10".toLong() // 10 as parsed as decimal
val java_parseLong010 = java.lang.Long.parseLong("010") // 10 as parsed as decimal
val java_parseLong10 = java.lang.Long.parseLong("10") // 10 as parsed as decimal

val kotlin_toLong010Radix = "010".toLong(8) // 8 as "octal" parsing is forced
val kotlin_toLong10Radix = "10".toLong(8) // 8 as "octal" parsing is forced
val java_parseLong010Radix = java.lang.Long.parseLong("010", 8) // 8 as "octal" parsing is forced
val java_parseLong10Radix = java.lang.Long.parseLong("10", 8) // 8 as "octal" parsing is forced

val java_decode010 = java.lang.Long.decode("010") // 8 as 0 means "octal"
val java_decode10 = java.lang.Long.decode("10") // 10 as parsed as decimal

1
string.toLong()

其中string是您的变量。


1
如果您不想在解析时处理NumberFormatException异常
 var someLongValue=string.toLongOrNull() ?: 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接