Kotlin有一个很好的特性,叫做字符串模板。

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

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

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

当前回答

举几个例子:

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

其他回答

不幸的是,在字符串模板中还没有内置的格式化支持,作为一种变通方法,你可以使用如下方法:

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

你需要将自己定义为.format(n)函数

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

这将只在Kotlin/JVM中工作。

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

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

请参阅Kotlin的文档

你的代码应该是:

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

芬兰湾的科特林1.7.2

String的format方法接受一个formatter-string和任意数量的nullable any类型的参数。

fun String.Companion.format(format: String, vararg args: Any?) : String

真正的代码可能是这样的:

fun main() {
    
    val pi: Double = 3.141592653589
    val gravity: Double = 9.80665
    var str = String.Companion.format("%.2f %n%.2f", pi, gravity)
    
    println(str)
}

其中%n是行分隔符,%f是浮点十进制格式。

结果是:

//    3.14 
//    9.81

举几个例子:

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

因为字符串。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