kotlin字符串模板中的格式

时间:2014-04-15 14:12:43

标签: string-formatting kotlin

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

8 个答案:

答案 0 :(得分:179)

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

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

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

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

目前Kotlin显然缺少一些功能,我们会修复它。

答案 1 :(得分:94)

作为一种解决方法,There is a Kotlin stdlib function可以很好地使用并与Java的String格式完全兼容(它只是Java的{{1}的包装器。 })

见Kotlin的documentation

您的代码将是:

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

答案 2 :(得分:18)

Kotlin的String类现在有一个format函数,它在内部使用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

答案 3 :(得分:7)

很简单, 使用:

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

答案 4 :(得分:2)

由于String.format只是一个内部调用java.lang.String.format的扩展函数(参见here),如果您需要更多灵活性,可以使用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

答案 5 :(得分:1)

几个例子:

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

答案 6 :(得分:-2)

尝试take。它返回一个包含前n个元素的列表。

val pi = 3.14159265358979323
val s = pi.take(4)

但是,正如抗拒所说的那样,这些收藏只是礼貌在下面的评论中对我的纠正。

您可以转换为字符串,使用take并转换回Double。

val a = 3.14159265358979323
val b = a.toString().take(4).toDouble()

虽然不是最好的主意,但它可行。

答案 7 :(得分:-2)

它有字符串格式 示例:

fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}