2014-04-15 13 views
72

Kotlin ha un'eccellente funzione chiamata modelli di stringa. Lo amo davvero.Formato nei modelli di stringa di Kotlin

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

Ma è possibile avere una formattazione nei modelli? Per esempio vorrei formattare doppia in modelli di 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"? 

risposta

86

Purtroppo, non c'è supporto integrato per la formattazione nei modelli ancora a corda, come una soluzione, è possibile utilizzare qualcosa come:

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

la funzione .format(n) avresti necessario definire se stessi come

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

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

+3

È questo ora disponibile ? –

+2

@RagunathJawahar, la risposta è ancora aggiornata, non ci siamo ancora migliorati –

+0

@AndreyBreslav Come fa il formato di interpolazione String float/double values? Le impostazioni locali del punto decimale dipendono o sempre un punto? –

60

Per risolvere il problema, There is a Kotlin stdlib function che può essere utilizzato in modo piacevole e pienamente compatibile con il formato stringa di Java (è solo un wrapper Java String.format())

Il tuo codice sarebbe:

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

Vedere anche la [documentazione] (https://stackoverflow.com/questions/23086291/format-in-kotlin-string-templates) per quella funzione –

+8

Amico il collegamento della documentazione è a questa domanda .. ?? – Rob

+2

Immagino che intendesse questa documentazione: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#format-java.util.Locale-java.lang.String- java.lang.Object ...- – stuckj

3

Kotlin di classe String dispone di una funzione format ora, che usa internamente String.format il metodo di 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 
+0

String.Companion. il formato non è ora disponibile in Kotlin v1.2.21. Qual è l'alternativa? –

1

Dal String.format è solo una funzione di estensione (vedi here), che chiede internamente java.lang.String.format si potrebbe scrivere la propria funzione di estensione utilizzando Java di DecimalFormat se avete 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