Formatuj w szablonach ciągów kotlin

199

Kotlin ma doskonałą funkcję zwaną szablonami ciągów. Naprawdę to kocham.

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

Ale czy możliwe jest jakiekolwiek formatowanie w szablonach? Na przykład chciałbym sformatować szablony Double in string w kotlin, przynajmniej ustawić liczbę cyfr po separatorze dziesiętnym:

val pi = 3.14159265358979323
val s = "pi = $pi??" // How to make it "pi = 3.14"?
MajesticRa
źródło
Czy istnieje na to rozwiązanie wieloplatformowe?
KenIchi,

Odpowiedzi:

249

Niestety, nie ma jeszcze wbudowanej obsługi formatowania w szablonach ciągów. Aby obejść ten problem, możesz użyć czegoś takiego:

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

.format(n)funkcja trzeba by określić siebie jako

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

W tej chwili Kotlina wyraźnie brakuje funkcjonalności, naprawimy to.

Andrey Breslav
źródło
7
Czy to jest teraz dostępne?
Ragunath Jawahar
4
@RagunathJawahar, odpowiedź jest wciąż aktualna, jeszcze jej nie
poprawiliśmy
3
@AndreyBreslav Co powiesz na teraz? Czy to jest dostępne?
cihan adil seven
37
Czy się mylę, czy to nadal nie jest dostępne prawie 4 lata później?
Warkst
6
Dodaj go jako prezent noworoczny na 2020 rok!
znak towarowy
133

Aby obejść ten problem, istnieje funkcja stdlib Kotlina, której można używać w przyjemny sposób iw pełni kompatybilny z formatem String w Javie (jest to tylko opakowanie wokół Java String.format())

Zobacz dokumentację Kotlina

Twój kod to:

val pi = 3.14159265358979323
val s = "pi = %.2f".format(pi)
akhy
źródło
2
Zgaduję, że miał na myśli tę dokumentację: docs.oracle.com/javase/8/docs/api/java/lang/…
stuckj
@Rob Zobacz także dyskusję na temat dokumentacji
Matt Mc
Działa w Kotlin 1.3.21
FP
28

Klasa String Kotlina ma teraz funkcję formatu , która wewnętrznie korzysta z String.formatmetody 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)

Stosowanie

val pi = 3.14159265358979323
val formatted = String.format("%.2f", pi) ;
println(formatted)
>>3.14
użytkownik1767754
źródło
1
String.Companion.format nie znajduje się teraz w Kotlin v1.2.21. Jaka jest alternatywa ?.
Sai
19

To proste, użyj:

val str:String = "%.2f".format(3.14159)
masoomyf
źródło
3

Ponieważ String.formatjest to tylko funkcja rozszerzenia (patrz tutaj ), która wywołuje wewnętrznie, java.lang.String.formatmożesz napisać własną funkcję rozszerzenia przy użyciu DecimalFormat Java, jeśli potrzebujesz większej elastyczności:

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

println(3.14159.format(2)) // 3.14
Willi Mentzel
źródło
0

Kilka przykładów:

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}")
Alexander Logger
źródło