265

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"?
4

7 回答 7

312

不幸的是,字符串模板中还没有对格式化的内置支持,作为一种解决方法,您可以使用类似的东西:

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

.format(n)您需要将自己定义为的功能

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

很明显,Kotlin 目前缺少一个功能,我们会修复它。

于 2014-04-15T15:21:26.820 回答
165

作为一种解决方法,有一个 Kotlin stdlib 函数可以很好地使用并且与 Java 的 String 格式完全兼容(它只是 Java 的包装器String.format()

查看 Kotlin 的文档

您的代码将是:

val pi = 3.14159265358979323
val s = "pi = %.2f".format(pi)
于 2015-11-03T06:22:50.163 回答
37

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
于 2017-12-08T00:33:25.393 回答
28

很简单,使用:

val str: String = "%.2f".format(3.14159)
于 2018-08-25T11:53:07.213 回答
7

因为String.format它只是一个内部调用的扩展函数(参见此处),如果您需要更大的灵活性,您可以使用 Java 的DecimalFormatjava.lang.String.format编写自己的扩展函数:

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

println(3.14159.format(2)) // 3.14
于 2017-12-08T09:14:11.863 回答
3

几个例子:

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

于 2020-01-15T03:38:18.413 回答
-4

它具有字符串格式示例:

fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}
于 2021-03-17T20:11:23.450 回答