Kotlin string şablonlarında format


199

Kotlin, string şablonları adı verilen mükemmel bir özelliğe sahiptir. Gerçekten çok seviyorum.

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

Ancak şablonlarda herhangi bir biçimlendirme olması mümkün müdür? Örneğin, en azından ondalık ayırıcıdan sonra bir dizi basamak ayarlamak için kotlin'de dize şablonlarında Double formatlamak istiyorum:

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

Bunun herhangi bir çoklu platform çözümü var mı?
KenIchi

Yanıtlar:


249

Ne yazık ki, dize şablonlarında biçimlendirme için henüz yerleşik bir destek yoktur, geçici bir çözüm olarak aşağıdakileri kullanabilirsiniz:

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

.format(n)fonksiyonu olarak kendinizi tanımlamanız gerekir

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

Burada Kotlin'den eksik olan bir parça işlevsellik var, bunu düzeltiriz.


7
Bu şimdi mevcut mu?
Ragunath Jawahar

4
@RagunathJawahar, cevap hala güncel, henüz geliştirmedik
Andrey Breslav

3
@AndreyBreslav Şimdi ne dersiniz? Bu mevcut mu?
cihan adil yedi

37
Yanlış mıyım yoksa bu neredeyse 4 yıl sonra hala mevcut değil mi?
Warkst

6
2020 için yeni yıl hediyesi olarak ekleyin!
mark mark

133

Geçici bir çözüm olarak, güzel bir şekilde kullanılabilen ve Java'nın String biçimiyle tamamen uyumlu bir Kotlin stdlib işlevi vardır (Java'nın etrafında sadece bir sarıcıdır String.format())

Kotlin'in belgelerine bakın

Kodunuz:

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

2
Bu dokümanları kastettiğini tahmin ediyorum: docs.oracle.com/javase/8/docs/api/java/lang/…
stuckj

Ayrıca @Rob bakınız tartışma belgelere
Matt Mc

Kotlin'de çalışır 1.3.21
FP Serbest

28

Kotlin'in String sınıfında, Java'nın yöntemini dahili olarak kullanan bir biçim işlevi var String.format:

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

kullanım

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

1
String.Companion.format şu anda Kotlin v1.2.21'de bulunmuyor. Alternatif nedir?
Sai

19

Basit, Kullanımı:

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

3

Yana String.formatsadece bir uzantısı fonksiyonudur (bkz burada içten der) java.lang.String.formatEğer Java'nın kullanarak kendi uzatma fonksiyonu yazabiliriz DecimalFormat size daha fazla esneklik gerekirse:

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

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

0

Birkaç örnek:

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}")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.