Format in Kotlin string templates

Kotlin has an excellent feature called string templates.

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

But is it possible to have any formatting in the templates? For example, I would like to format Double in string templates in kotlin, at least to set a number of digits after a decimal separator:

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

8 Answers

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) 

This will work only in Kotlin/JVM.

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

17

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) 
3

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 
1

It's simple, use:

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

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 

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

It has string formatting Example in Kotlin for Android TextView:

val format = String.format("<font color=#3177a3> test1: <b>%s</b><br> test2: <b>%s</b><br> test3: <b>%s</b></font>", "value1", "value2", "value3") textView.text = format 

It has string formatting Example:

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like