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.