Format in Kotlin-String-Vorlagen


199

Kotlin hat eine hervorragende Funktion namens String-Vorlagen. Ich liebe es wirklich.

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

Aber ist es möglich, die Vorlagen zu formatieren? Zum Beispiel möchte ich Double in String-Vorlagen in Kotlin formatieren, um zumindest eine Anzahl von Ziffern nach einem Dezimaltrennzeichen festzulegen:

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

Gibt es dafür eine plattformübergreifende Lösung?
KenIchi

Antworten:


248

Leider gibt es noch keine integrierte Unterstützung für die Formatierung in Zeichenfolgenvorlagen. Um dieses Problem zu umgehen, können Sie Folgendes verwenden:

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

die .format(n)Funktion, als die Sie sich definieren müssen

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

Es gibt hier eindeutig eine Funktionalität, die Kotlin im Moment fehlt. Wir werden sie beheben.


7
Ist das jetzt verfügbar?
Ragunath Jawahar

4
@RagunathJawahar, die Antwort ist immer noch aktuell, wir haben sie noch nicht verbessert
Andrey Breslav

3
@AndreyBreslav Wie wäre es jetzt? Ist das verfügbar?
Cihan Adil sieben

37
Irre ich mich oder ist dies fast 4 Jahre später immer noch nicht verfügbar?
Warkst

6
Fügen Sie es als Neujahrsgeschenk für 2020 hinzu!
Markieren Sie Mark


27

Kotlins String-Klasse verfügt jetzt über eine Formatierungsfunktion , die intern die Java- String.formatMethode verwendet:

/**
 * 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)

Verwendung

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

1
String.Companion.format wurde jetzt in Kotlin v1.2.21 nicht gefunden. Was ist die Alternative?
Sai

19

Es ist einfach, Verwendung:

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

3

Da String.formates sich nur um eine Erweiterungsfunktion handelt (siehe hier ), die intern aufgerufen wird, können Sie java.lang.String.formatIhre eigene Erweiterungsfunktion mit Java DecimalFormat schreiben, wenn Sie mehr Flexibilität benötigen:

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

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

0

Einige Beispiele:

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}")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.