Глиф Учебники

Как перевести строку в число и обратно

Справочник · Kotlin · 1 минута чтения

Kotlin
fun main() {
    val n = "42".toInt()
    println(n + 1)
    val d = "2.5".toDouble()
    println(d * 2)
    val big = "9000000000".toLong()
    println(big / 1000)
    val s = 123.toString()
    println(s + "!")
    println("abc".toIntOrNull())
    println("15".toIntOrNull())
}
Вывод
43
5.0
9000000
123!
null
15
ФункцияЧто делаетЕсли в строке не число
toInt()строка → Intошибка NumberFormatException
toLong()строка → Longошибка
toDouble()строка → Doubleошибка
toIntOrNull()строка → Int?null
toDoubleOrNull()строка → Double?null
toString()число → строка—

Какую функцию выбрать: toInt() — когда строка точно число (её записала сама программа), toIntOrNull() — когда строку набрал человек или она пришла из файла и может оказаться чем угодно.

Число в строку

Чаще всего число вставляют в текст шаблоном: "Total: $n". Отдельной строкой его делает toString(). Для ведущих нулей есть padStart: 7.toString().padStart(3, '0') даёт "007". Дробное число с нужным числом знаков после запятой выводится через format — в справке Как вывести число с двумя знаками после запятой.

Если строка может быть не числом

"abc".toInt() роняет программу:

Текст
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"

Когда строка пришла от человека, из файла или из сети, берите toIntOrNull() и решайте, что делать при null:

Kotlin
fun main() {
    val age = readln().toIntOrNull()
    if (age == null) {
        println("Enter a number")
    } else {
        println("Next year: ${age + 1}")
    }
}
Ввод
twenty
Вывод
Enter a number

Короткий вариант с запасным значением — readln().toIntOrNull() ?: 0.

Читать число, пока не введут правильно:

Kotlin
fun main() {
    var n: Int? = null
    while (n == null) {
        print("Number: ")
        n = readln().toIntOrNull()
    }
    println("OK: $n")
}

Подводные камни

Цифра-символ и число

У символа (Char) свои функции:

Kotlin
fun main() {
    val c = '7'
    println(c.digitToInt())
    println(c.code)
    val sum = "2024".map { it.digitToInt() }.sum()
    println(sum)
}
Вывод
7
55
8

digitToInt() даёт значение цифры, а code — номер символа в таблице Unicode: у '7' это 55. Частая ошибка — ждать от '7'.code число 7.

Другие системы счисления

"ff".toInt(16) — 255, "1010".toInt(2) — 10; обратно: 255.toString(16) — "ff", 10.toString(2) — "1010".