Format in kotlin string templates

前端 未结 6 1320
青春惊慌失措
青春惊慌失措 2020-12-12 17:40

Kotlin has an excellent feature called string templates. I really love it.

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

But

相关标签:
6条回答
  • 2020-12-12 18:09

    As a workaround, There is a Kotlin stdlib function that can be used in a nice way and fully compatible with Java's String format (it's only a wrapper around Java's String.format())

    See Kotlin's documentation

    Your code would be:

    val pi = 3.14159265358979323
    val s = "pi = %.2f".format(pi)
    
    0 讨论(0)
  • 2020-12-12 18:11

    Since String.format is only an extension function (see here) which internally calls java.lang.String.format you could write your own extension function using Java's DecimalFormat if you need more flexibility:

    fun Double.format(fracDigits: Int): String {
        val df = DecimalFormat()
        df.setMaximumFractionDigits(fracDigits)
        return df.format(this)
    }
    
    println(3.14159.format(2)) // 3.14
    
    0 讨论(0)
  • 2020-12-12 18:17

    Its simple, Use:

    val str:String = "%.2f".format(3.14159)
    
    0 讨论(0)
  • 2020-12-12 18:19

    Unfortunately, there's no built-in support for formatting in string templates yet, as a workaround, you can use something like:

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

    the .format(n) function you'd need to define yourself as

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

    There's clearly a piece of functionality here that is missing from Kotlin at the moment, we'll fix it.

    0 讨论(0)
  • 2020-12-12 18:22

    Kotlin's String class has a format function now, which internally uses Java's String.format method:

    /**
     * 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)
    

    Usage

    val pi = 3.14159265358979323
    val formatted = String.format("%.2f", pi) ;
    println(formatted)
    >>3.14
    
    0 讨论(0)
  • 2020-12-12 18:31

    A couple of examples:

    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}")
    
    
    0 讨论(0)
提交回复
热议问题