Как преобразовать String в Int в Kotlin?

Я работаю над консольным приложением в Kotlin, где я принимаю несколько аргументов в функции main()

fun main(args: Array<String>) {
    // validation & String to Integer conversion
}

Я хочу проверить, является ли String действительным целым числом, и преобразовать то же самое, или же мне нужно вызвать какое-то исключение.

Как я могу решить это?

Ответы

Ответ 1

Вы можете вызвать toInt() для ваших экземпляров String:

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")
    }
}

Ответ 2

val i = "42".toIntOrNull()

Имейте в виду, что результат обнуляем, как следует из названия.

Ответ 3

На самом деле, есть несколько способов:

Дано:

var numberString : String = "numberString" 
// number is the int value of numberString (if any)
var defaultValue : Int    = defaultValue

Тогда у нас есть:

+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString is a valid number ?            |  true    | false                 |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toInt()                        |  number  | NumberFormatException |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toIntOrNull()                  |  number  | null                  |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toIntOrNull() ?: defaultValue  |  number  | defaultValue          |
+—————————————————————————————————————————————+——————————+———————————————————————+

Ответ 4

я бы пошел с чем-то вроде этого.

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)
}

это довольно хороший способ сделать это, не вводя небезопасные значения с нулевым значением.

Ответ 5

Как предложено выше, используйте toIntOrNull().

Разбирает строку как число [Int] и возвращает результат или null, если строка не является допустимым представлением числа.

val a: Int? = "11".toIntOrNull() // 11
val b: Int? = "abc".toIntOrNull() // null
val c: Int? = null?.toIntOrNull() // null