Магия строк: почему форматирование в 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 |
Низкая | Низкая | Максимальный | Нет | Локализация, склонения |
| Расширения | Высокая
БлогиРекомендаций по книгамЧитайте также |