Как перевести строку в число и обратно
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:
fun main() {
val age = readln().toIntOrNull()
if (age == null) {
println("Enter a number")
} else {
println("Next year: ${age + 1}")
}
}twentyEnter a numberКороткий вариант с запасным значением — readln().toIntOrNull() ?: 0.
Читать число, пока не введут правильно:
fun main() {
var n: Int? = null
while (n == null) {
print("Number: ")
n = readln().toIntOrNull()
}
println("OK: $n")
}Подводные камни
- Пробелы.
" 42".toInt()— ошибка, а" 42".toIntOrNull()—null. Уберите пробелы по краям:s.trim().toInt(). - Запятая в дробных.
"3,5".toDouble()— ошибка: дробная часть отделяется точкой. Если люди вводят запятую, замените её:s.replace(',', '.').toDouble(). - Дробное в целое.
"3.5".toInt()— ошибка. СначалаtoDouble(), потомtoInt()— дробная часть отбросится. - Слишком большое число.
"3000000000".toInt()— ошибка: больше пределаInt. БеритеtoLong().
Цифра-символ и число
У символа (Char) свои функции:
fun main() {
val c = '7'
println(c.digitToInt())
println(c.code)
val sum = "2024".map { it.digitToInt() }.sum()
println(sum)
}7
55
8digitToInt() даёт значение цифры, а code — номер символа в таблице Unicode: у '7' это 55. Частая ошибка — ждать от '7'.code число 7.
Другие системы счисления
"ff".toInt(16) — 255, "1010".toInt(2) — 10; обратно: 255.toString(16) — "ff", 10.toString(2) — "1010".