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

110

我正在使用 Kotlin 开发控制台应用程序,在main()函数中接受多个参数。

fun main(args: Array<String>) {
    // validation & String to Integer conversion
}
我想检查一个 String 是否是有效的整数,如果是则转换它,否则我必须抛出一些异常。

我该如何解决这个问题?

返回结果:

我想检查一个 String 是否是有效的整数,如果是则转换它,否则我必须抛出一些异常。

我该如何解决这个问题?


1
使用 String.toInt(),将其包装在 try-catch 中,并处理 NumberFormatException - earthw0rmjim
3
这不是一个静态方法,你需要在你的字符串实例上调用 toInt() 方法。例如,args[0].toInt() - earthw0rmjim
谢谢,那个有效。仍在使用try-catch块。 - Sai Sarath C P
6
你还可以使用toIntOrNull来获取Int?类型的结果,这样就不必使用try-catch了。 - zsmb13
请查看文档 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/to-int.html - David Hackro
显示剩余3条评论
12个回答

126

您可以在字符串实例上调用 toInt() 方法:

fun main(args: Array<String>) {
    for (str in args) {
        try {
            val parsedInt = str.toInt()
            println("The parsed int is $parsedInt")
        } catch (nfe: NumberFormatException) {
            // not a valid int
        }
    }
}

或者使用toIntOrNull()作为另一种选择:

for (str in args) {
    val parsedInt = str.toIntOrNull()
    if (parsedInt != null) {
        println("The parsed int is $parsedInt")
    } else {
        // not a valid int
    }
}

如果您不关心无效值,那么可以将toIntOrNull()与安全调用运算符和作用域函数结合起来使用,例如:

for (str in args) {
    str.toIntOrNull()?.let {
        println("The parsed int is $it")
    }
}

36

实际上,有几种方法:

给定:

// aString is the string that we want to convert to number    
// defaultValue is the backup value (integer) we'll have in case of conversion failed

var aString: String = "aString"     
var defaultValue : Int    = defaultValue

接下来我们有:

操作 成功操作 不成功的操作
aString.toInt() 数字值 NumberFormatException异常
aString.toIntOrNull() 数字值 null
aString.toIntOrNull() ?: defaultValue 数字值 defaultValue

如果aString是一个有效的整数,则会得到它的数字值,否则根据所使用的函数,在不成功的操作列中看到结果。


1
一张表不容易理解。请添加列标题。什么是真和假? - CoolMind
4
嗨,CoolMind。第一行是列标题,回答了问题(numberString 是一个有效的数字)是否为真或假。 - Hoa Nguyen
抱歉,我又理解表格不是那么容易,所以修改了答案。 - CoolMind

20
val i = "42".toIntOrNull()

请记住,正如名称所示,结果可以为空。


7
如上所建议,使用 toIntOrNull()

将字符串解析为 [Int] 数字,并返回结果或 null(如果字符串不是数字的有效表示形式)。

val a = "11".toIntOrNull()   // 11
val b = "-11".toIntOrNull()  // -11
val c = "11.7".toIntOrNull() // null
val d = "11.0".toIntOrNull() // null
val e = "abc".toIntOrNull()  // null
val f = null?.toIntOrNull()  // null

5
string_name.toString().toInt()

string_name转换为String,然后将生成的String转换为int


2
为什么要调用 toString() 方法?提问者已经有一个字符串可以使用了。 - Cristik
虽然这段代码可能提供了问题的解决方案,但最好添加上为什么/如何运作的上下文。这可以帮助未来的用户学习并最终将该知识应用到他们自己的代码中。当代码被解释时,您还可能会得到用户的积极反馈/赞同。 - Amit Verma

4
在 Kotlin 中:
只需这样做。
val abc = try {stringNumber.toInt()}catch (e:Exception){0}

在 catch 块中,您可以为字符串没有转换为 "Int" 的任何情况设置默认值。

4
我使用此实用函数:
fun safeInt(text: String, fallback: Int): Int {
    return text.toIntOrNull() ?: fallback
}

1
以下是有关编程的内容的翻译,英文原文可以在 https://dev59.com/J1UL5IYBdhLWcg3wSmYo#54718406 找到。 - dkb

2
我建议使用类似这样的方案。
import java.util.*

fun String?.asOptionalInt() = Optional.ofNullable(this).map { it.toIntOrNull() }

fun main(args: Array<String>) {
    val intArgs = args.map {
        it.asOptionalInt().orElseThrow {
            IllegalArgumentException("cannot parse to int $it")
        }
    }

    println(intArgs)
}

这是一种非常好的方法,可以避免引入不安全的可空值。


谢谢您的回复。我是Kotlin的新手,您能否添加一些注释来解释所提供的代码?这也可能有助于其他人。 - Sai Sarath C P
6
这只是一种更长、更慢的写法,与 it.toIntOrNull() ?: throw IllegalArgumentException("cannot parse to int $it") 的含义相同。 - Alexey Romanov

1
你可以使用readLine()!!.toInt()进行直接更改。
示例:
fun main(){

    print("Enter the radius = ")
    var r1 = readLine()!!.toInt()
    var area = (3.14*r1*r1)
    println("Area is $area")

}

1
在 fun toInt() 之前添加 (?)。

val number_int = str?.toInt()


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