Форматування в шаблонах рядків kotlin


199

У Котліна є відмінна функція під назвою шаблони рядків. Я дуже люблю це.

 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"?

Чи є для цього якесь багатоплатформене рішення?
KenIchi

Відповіді:


249

На жаль, поки немає вбудованої підтримки для форматування в шаблонах рядків, як вирішення, ви можете використовувати щось на зразок:

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

.format(n)функції ви повинні визначити себе як

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

Тут явно є функціонал, який у Котліна відсутній на даний момент, і ми це виправимо.


7
Чи доступно це зараз?
Рагунат Джавахар

4
@RagunathJawahar, відповідь досі актуальна, ми її ще не покращували
Андрій Бреслав

3
@AndreyBreslav Як щодо цього? Чи доступно це?
cihan adil сім

37
Я помиляюся чи це все ще не доступно майже через 4 роки?
Варкст

6
Додайте його як новорічний подарунок на 2020 рік!
відмітка позначки

133

Як вирішення, існує функція stdlib Kotlin, яка може бути приємно використана і повністю сумісна з форматом String Java (це лише обгортка навколо Java String.format())

Дивіться документацію Котліна

Ваш код буде:

val pi = 3.14159265358979323
val s = "pi = %.2f".format(pi)

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

1
String.Companion.format зараз не знайдено в Kotlin v1.2.21. Яка альтернатива ?.
Сай


3

Оскільки String.formatлише функція розширення (див. Тут ), яка внутрішньо викликає, java.lang.String.formatви можете написати власну функцію розширення за допомогою програми DecimalFormat Java, якщо вам потрібна більша гнучкість:

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}")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.