Format dalam templat string kotlin


199

Kotlin memiliki fitur luar biasa yang disebut templat string. Saya sangat menyukainya.

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

Tetapi apakah mungkin untuk memiliki pemformatan di template? Sebagai contoh, saya ingin memformat Templat string dobel di kotlin, setidaknya untuk menetapkan jumlah digit setelah pemisah desimal:

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

Apakah ada solusi multiplatform untuk ini?
— KenIchi

Jawaban:


248

Sayangnya, belum ada dukungan bawaan untuk memformat dalam templat string, sebagai solusi, Anda dapat menggunakan sesuatu seperti:

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

yang .format(n)fungsi Anda akan perlu untuk mendefinisikan diri sendiri sebagai

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

Jelas ada fungsi di sini yang hilang dari Kotlin saat ini, kami akan memperbaikinya.


7
Apakah ini tersedia sekarang?
— Ragunath Jawahar

4
@RagunathJawahar, jawabannya masih terbaru, kami belum memperbaikinya
— Andrey Breslav

3
@AndreyBreslav Bagaimana kalau sekarang? Apakah ini tersedia?
— cihan adil tujuh

37
Apakah saya salah atau apakah ini masih tidak tersedia hampir 4 tahun kemudian?
— Warkst

6
Tambahkan sebagai hadiah Tahun Baru untuk tahun 2020!
— tandai tandai

132

Sebagai solusinya, Ada fungsi stdlib Kotlin yang dapat digunakan dengan cara yang baik dan sepenuhnya kompatibel dengan format String Java (itu hanya pembungkus di sekitar JavaString.format() )

Lihat dokumentasi Kotlin

Kode Anda adalah:

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

2
Saya kira maksudnya adalah dokumentasi ini: docs.oracle.com/javase/8/docs/api/java/lang/…
— stuckj

@Rob. Lihat juga diskusi tentang dokumentasi
— Matt Mc

Bekerja di Kotlin 1.3.21
— FP Secara Bebas

27

Kelas String Kotlin memiliki fungsi format sekarang, yang secara internal menggunakan String.formatmetode 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)

Pemakaian

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

1
String.Companion.format tidak ditemukan sekarang di Kotlin v1.2.21. Apa alternatifnya?
— Sai

19

Sederhana, Gunakan:

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

3

Karena String.formathanya fungsi ekstensi (lihat di sini ) yang secara internal memanggil java.lang.String.formatAnda dapat menulis fungsi ekstensi Anda sendiri menggunakan Java's DecimalFormat jika Anda membutuhkan lebih banyak fleksibilitas:

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

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

0

Beberapa contoh:

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}")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.