以Kotlin字符串模板格式


198

Kotlin具有一项出色的功能,称为字符串模板。我很喜欢。

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

但是模板中是否可以有任何格式?例如,我想在kotlin中格式化字符串模板中的Double格式,至少要在小数点分隔符后设置一些数字:

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

是否有任何多平台解决方案?
KenIchi

Answers:


248

不幸的是,尚无内置的字符串模板格式支持,但是,作为一种解决方法,您可以使用以下方法:

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

.format(n)功能你需要自己定义为

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

Kotlin目前显然缺少这里的一项功能,我们将对其进行修复。


7
现在可以使用吗?
Ragunath Jawahar 2015年

4
@RagunathJawahar,答案仍然是最新的,我们尚未对其进行改进
Andrey Breslav

3
@AndreyBreslav现在怎么样?这可以吗?
cihan adil 7年7

37
我是误会了还是将近4年后仍然无法使用?
Warkst,

6
将其添加为2020年的新年礼物!
mark mark


27

Kotlin的String类现在具有格式函数,该函数内部使用Java的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)

用法

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

1
Kotlin v1.2.21中现在找不到String.Companion.format。有什么选择?
西

19

简单,使用方法:

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

3

由于String.format只是内部调用的扩展函数(请参阅此处),因此,如果需要更大的灵活性,java.lang.String.format可以使用Java的DecimalFormat编写自己的扩展函数:

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

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

0

几个例子:

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}")

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.