Формат в шаблонах строк kotlin

199

У Kotlin есть отличная функция, которая называется строковые шаблоны. Мне действительно нравится это.

 val i = 10 
 val s = "i = $i" // evaluates to "i = 10"

Но возможно ли иметь какое-либо форматирование в шаблонах? Например, я хотел бы отформатировать Double в строковых шаблонах в kotlin, по крайней мере, чтобы установить количество цифр после десятичного разделителя:

val pi = 3.14159265358979323
val s = "pi = $pi??" // How to make it "pi = 3.14"?
MajesticRa
источник
Есть ли мультиплатформенное решение для этого?
Кеничи

Ответы:

249

К сожалению, пока нет встроенной поддержки форматирования в строковых шаблонах. В качестве обходного пути вы можете использовать что-то вроде:

"pi = ${pi.format(2)}"

.format(n)функции вы должны определить себя как

fun Double.format(digits: Int) = "%.${digits}f".format(this)

Здесь явно есть какая-то функциональность, которой нет у Kotlin на данный момент, мы исправим это.

Андрей Бреслав
источник
7
Это доступно сейчас?
Рагунатх Джавахар
4
@RagunathJawahar, ответ все еще актуален, мы еще не улучшили его
Андрей Бреслав
3
@AndreyBreslav Как насчет сейчас? Это доступно?
Цихан Адил семь
37
Я ошибаюсь или это все еще не доступно почти 4 года спустя?
Warkst
6
Добавьте его в качестве новогоднего подарка на 2020 год!
отметка
133

В качестве обходного пути, есть функция stdlib Kotlin, которую можно использовать хорошим способом и полностью совместить с форматом Java String (это только оболочка вокруг Java String.format())

Смотрите документацию Kotlin

Ваш код будет:

val pi = 3.14159265358979323
val s = "pi = %.2f".format(pi)
akhy
источник
2
Я предполагаю, что он имел в виду эту документацию: docs.oracle.com/javase/8/docs/api/java/lang/…
stuckj
@Rob Смотрите также обсуждение документации
Мэтт Мак
Работает в Котлине 1.3.21
FP Свободно
28

Класс String Kotlin теперь имеет функцию форматирования , которая внутренне использует String.formatметод Java :

/**
 * Uses this string as a format string and returns a string obtained by substituting the specified arguments,
 * using the default locale.
 */
@kotlin.internal.InlineOnly
public inline fun String.Companion.format(format: String, vararg args: Any?): String = java.lang.String.format(format, *args)

использование

val pi = 3.14159265358979323
val formatted = String.format("%.2f", pi) ;
println(formatted)
>>3.14
user1767754
источник
1
String.Companion.format не найден в Kotlin v1.2.21. Какая альтернатива?
Саи
19

Это просто, используйте:

val str:String = "%.2f".format(3.14159)
masoomyf
источник
3

Поскольку String.formatэто только функция расширения (см. Здесь ), которая внутренне вызывает, java.lang.String.formatвы можете написать свою собственную функцию расширения, используя Java DecimalFormat, если вам нужна большая гибкость:

fun Double.format(fracDigits: Int): String {
    val df = DecimalFormat()
    df.setMaximumFractionDigits(fracDigits)
    return df.format(this)
}

println(3.14159.format(2)) // 3.14
Вилли Ментцель
источник
0

Пара примеров:

infix fun Double.f(fmt: String) = "%$fmt".format(this)
infix fun Double.f(fmt: Float) = "%${if (fmt < 1) fmt + 1 else fmt}f".format(this)

val pi = 3.14159265358979323

println("""pi = ${pi f ".2f"}""")
println("pi = ${pi f .2f}")
Александр Логгер
источник