首页 文章

kotlin字符串模板中的格式

提问于
浏览
116

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

7 回答

  • 13

    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
    
  • 2

    它简单,用途:

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

    很多答案都是指String.format和相关的,但不是最新master分支中的正确位置 . 作为参考,this是它现在所在的位置 .

  • 145

    由于 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
    
  • -1

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

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

    但这正是rekire所说的收藏品,他们在下面的评论中礼貌地纠正了我 .

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

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

    虽然不是最好的主意,但它确实有效 .

  • 0

    遗憾的是,对于字符串模板中的格式化没有内置支持,作为解决方法,您可以使用以下内容:

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

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

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

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

  • 75

    作为一种解决方法,There is a Kotlin stdlib function可以以一种很好的方式使用并且与Java 's String format (it'完全兼容只是Java的 String.format() 的包装器

    你的代码是:

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

相关问题