Форматирование строк в Kotlin: 5 подходов для профи

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Магия строк: почему форматирование в Kotlin — это искусство

Представьте: вы пишете приложение для трекинга спортивных тренировок. Нужно вывести сообщение: "Привет, Алексей! Ваше время: 42.5 км за 2:15:07. Лучший результат на 3.2% лучше.". Если собирать такую строку конкатенацией (склеиванием) в стиле Java — код превратится в кашу из плюсов и кавычек. Форматирование строк в Kotlin решает эту проблему элегантно и мощно.

В этой статье мы разберем 5 подходов к Kotlin String formatting. Вы узнаете, когда использовать интерполяцию, когда — старый добрый String.format(), а когда — продвинутые шаблоны. Поехали!

1. Интерполяция строк: хлеб и масло Kotlin

Самая популярная и простая техника — интерполяция строк в Kotlin. Она встроена прямо в язык: используйте знак доллара $ для вставки переменной и ${} для выражений.

val name = "Анна"
val age = 28
val message = "Меня зовут $name, мне $age лет."
println(message) // Меня зовут Анна, мне 28 лет.

// Выражения с фигурными скобками
val price = 49.99
val discount = 0.2
val finalPrice = "Цена со скидкой: ${price * (1 - discount)} руб."
println(finalPrice) // Цена со скидкой: 39.992 руб.

Плюсы: читаемость, скорость, никаких лишних вызовов. Минусы: нет контроля формата чисел (например, количество знаков после запятой).

Когда использовать

  • Простые сообщения, логи, UI-тексты
  • Когда не нужна точная настройка формата чисел или дат
  • Внутри println() или StringBuilder

2. String.format(): наследие Java в Kotlin

Если нужен контроль формата — на помощь приходит String.format() в Kotlin. Это прямой мост к Java-методу String.format() с теми же спецификаторами (%s, %d, %.2f).

val pi = 3.1415926535
val formatted = String.format("Число π с тремя знаками: %.3f", pi)
println(formatted) // Число π с тремя знаками: 3.142

// Несколько аргументов
val name = "Иван"
val score = 95
val result = String.format("%s набрал %d баллов из 100", name, score)
println(result) // Иван набрал 95 баллов из 100

Важный нюанс: форматирование строк Kotlin String.format не является type-safe — если передать не тот тип, получите исключение в рантайме. Для статической проверки используйте Kotlin-специфичные методы (см. раздел 5).

3. MessageFormat: когда нужны шаблоны с плейсхолдерами

Для сложных шаблонов с повторяющимися аргументами или локализацией — MessageFormat в Kotlin. Он умеет выбирать форму слова (единственное/множественное число) и форматировать даты.

import java.text.MessageFormat

val pattern = "У {0} {1} {0,choice,0#яблок|1#яблоко|2#яблока}."
val result = MessageFormat.format(pattern, "Пети", 5)
println(result) // У Пети 5 яблок.

// С датой
val datePattern = "Сегодня {0,date,long}. Время: {0,time,short}"
val now = java.util.Date()
println(MessageFormat.format(datePattern, now))

Когда выбирать: интернационализация (i18n), сложные склонения, шаблоны с 5+ аргументами. Минус: громоздкий синтаксис и зависимость от java.text.

4. Kotlin-расширения: краткость и типобезопасность

Сообщество Kotlin обожает расширения для форматирования строк. Можно написать свой велосипед или использовать готовые библиотеки (например, kotlinx.string).

// Простейшее расширение
fun String.format(vararg args: Any?): String {
    return String.format(this, *args)
}

// Использование
val template = "Привет, %s! Твой баланс: %.2f USD"
val msg = template.format("Максим", 1234.5678)
println(msg) // Привет, Максим! Твой баланс: 1234.57 USD

Еще один популярный подход — шаблоны с именованными аргументами. Например, с помощью buildString:

data class User(val name: String, val age: Int)

val user = User("Ольга", 32)
val info = buildString {
    append("Пользователь: ")
    append(user.name)
    append(", возраст: ")
    append(user.age)
}
println(info) // Пользователь: Ольга, возраст: 32

5. Современный подход: Anko и Ktor шаблоны

В мире Android и серверного Kotlin есть свои фреймворки. Например, Anko для Kotlin (устарел, но идеи живы) или шаблоны Ktor для веба.

// Пример с Ktor HTML DSL (упрощенно)
import io.ktor.html.*
import kotlinx.html.*

fun HTML.userCard(user: User) {
    div {
        h2 { +"Карточка ${user.name}" }
        p { +"Возраст: ${user.age}" }
    }
}

Это уже не просто форматирование строк в Kotlin, а целые DSL (Domain-Specific Languages). Они дают максимальную гибкость, но требуют изучения.

Сравнительная таблица подходов

Подход Скорость Читаемость Контроль формата Типобезопасность Лучший сценарий
Интерполяция $ Высокая Отличная Низкий Да Быстрые сообщения
String.format() Средняя Средняя Высокий Нет Числа, даты
MessageFormat Низкая Низкая Максимальный Нет Локализация, склонения
Расширения Высокая

Блоги

Рекомендаций по книгам