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

Andrey Breslav
sumber
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)
akhy
sumber
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
pengguna1767754
sumber
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)
masoomyf
sumber
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
Willi Mentzel
sumber
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}")
Alexander Logger
sumber