Long.valueOf(String s)
这样的方法,我陷入了困境。在Kotlin中如何将
String
转换为Long
?Long.valueOf(String s)
这样的方法,我陷入了困境。String
转换为Long
?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
String
有对应的扩展方法:
"10".toLong()
扩展方法可用于String
,将其解析成其他原始类型。以下是示例:
str.toLongOrNull()
和其他类似命名的方法也非常有用。使用它们,你可以执行像这样的操作:str.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number")
。 - sotrh注意:提到 jet.String
的答案已经过时了。下面是当前 Kotlin(1.0)的内容:
Kotlin 中的任何 String
已经有一个扩展函数,可以调用 toLong()
。不需要特别处理,只需使用即可。
所有 String 的扩展函数 都有文档说明,您可以在 API 参考文档 中查找其他标准库的扩展函数。
实际上,在90%的情况下,您需要检查“长”是否有效,因此您需要:
"10".toLongOrNull()
很有趣。像这样的代码:
val num = java.lang.Long.valueOf("2");
println(num);
println(num is kotlin.Long);
2
true
java.lang.Long
和 long 原始类型转换为 kotlin.Long
。所以,这是一种解决方案,但我希望看到不使用 java.lang 包的工具。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
在答案中没有提到的一个好用的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
string.toLong()
其中string
是您的变量。
var someLongValue=string.toLongOrNull() ?: 0
String
都有一个扩展函数toLong()
以及toInt()
和其他函数。您可以使用这些函数。也许 @ilya 可以更新此答案以适应当前的 Kotlin(删除jet.String
引用)。 - Jayson Minard