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"?
MajesticRa
quelle
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.

Andrey Breslav
quelle
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
132

Als Problemumgehung gibt es eine Kotlin stdlib-Funktion , die auf nette Weise verwendet werden kann und vollständig mit dem String-Format von Java kompatibel ist (es ist nur ein Wrapper um Java String.format()).

Siehe Kotlins Dokumentation

Ihr Code wäre:

val pi = 3.14159265358979323
val s = "pi = %.2f".format(pi)
akhy
quelle
2
Ich
vermute,
@ Rob Siehe auch Diskussion über die Dokumentation
Matt Mc
Arbeitet in Kotlin 1.3.21
FP frei
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
user1767754
quelle
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)
masoomyf
quelle
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
Willi Mentzel
quelle
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}")
Alexander Logger
quelle