Formatta nei modelli di stringa di kotlin


199

Kotlin ha un'eccellente funzione chiamata template string. Lo amo davvero.

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

Ma è possibile avere una formattazione nei modelli? Ad esempio, vorrei formattare Double in template stringa in kotlin, almeno per impostare un numero di cifre dopo un separatore decimale:

val pi = 3.14159265358979323
val s = "pi = $pi??" // How to make it "pi = 3.14"?

Esiste una soluzione multipiattaforma per questo?
KenIchi il

Risposte:


249

Sfortunatamente, non esiste ancora un supporto integrato per la formattazione nei modelli di stringa, come soluzione alternativa puoi usare qualcosa come:

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

la .format(n)funzione di cui dovresti definirti

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

C'è chiaramente un pezzo di funzionalità qui che al momento manca a Kotlin, lo sistemeremo.


7
Questo è disponibile ora?
Ragunath Jawahar,

4
@RagunathJawahar, la risposta è ancora aggiornata, non abbiamo ancora migliorato
Andrey Breslav

3
@AndreyBreslav Che ne dici di adesso? È disponibile?
cihan adil,

37
Sbaglio o non è ancora disponibile quasi 4 anni dopo?
Warkst,

6
Aggiungilo come regalo di Capodanno per il 2020!
segna il

133

Per ovviare al problema, esiste una funzione stdlib di Kotlin che può essere utilizzata in modo piacevole e pienamente compatibile con il formato String di Java (è solo un wrapper attorno a Java String.format())

Vedi la documentazione di Kotlin

Il tuo codice sarebbe:

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

2
Immagino che intendesse questa documentazione: docs.oracle.com/javase/8/docs/api/java/lang/…
stuckj

@Rob Vedi anche la discussione sulla documentazione
Matt Mc

Funziona a Kotlin 1.3.21
FP liberamente il

28

La classe String di Kotlin ora ha una funzione di formattazione , che utilizza internamente il String.formatmetodo 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)

uso

val pi = 3.14159265358979323
val formatted = String.format("%.2f", pi) ;
println(formatted)
>>3.14

1
String.Companion.format non è stato trovato ora in Kotlin v1.2.21. Qual è l'alternativa?
Sai,

19

È semplice, usa:

val str:String = "%.2f".format(3.14159)

3

Poiché String.formatè solo una funzione di estensione (vedi qui ) che chiama internamente java.lang.String.formatpuoi scrivere la tua funzione di estensione usando DecimalFormat di Java se hai bisogno di maggiore flessibilità:

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

println(3.14159.format(2)) // 3.14

0

Un paio di esempi:

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}")

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.