270

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"?
Willi Mentzel
  • 24,988
  • 16
  • 102
  • 110
MajesticRa
  • 13,032
  • 11
  • 58
  • 74

8 Answers8

319

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.

cubuspl42
  • 7,000
  • 4
  • 35
  • 60
Andrey Breslav
  • 22,801
  • 10
  • 62
  • 61
165

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)
William Desportes
  • 1,138
  • 1
  • 17
  • 25
akhy
  • 5,369
  • 6
  • 37
  • 60
  • 2
    I'm guessing he meant this documentation: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#format-java.util.Locale-java.lang.String-java.lang.Object...- – stuckj Dec 27 '17 at 05:35
  • @Rob See also [discussion](https://stackoverflow.com/questions/23086291/format-in-kotlin-string-templates#comment79967924_33492636) on the documentation – Matt Mc Mar 09 '18 at 04:44
  • Works in Kotlin 1.3.21 – F. P. Freely Apr 09 '19 at 16:58
39

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
Willi Mentzel
  • 24,988
  • 16
  • 102
  • 110
user1767754
  • 21,126
  • 14
  • 125
  • 152
  • 2
    String.Companion.format is not found now in Kotlin v1.2.21. What is the alternative?. – Sai Feb 03 '18 at 09:07
32

It's simple, use:

val str: String = "%.2f".format(3.14159)
Willi Mentzel
  • 24,988
  • 16
  • 102
  • 110
masoomyf
  • 584
  • 7
  • 13
7

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
Willi Mentzel
  • 24,988
  • 16
  • 102
  • 110
3

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

Lessneek
  • 1,660
  • 1
  • 17
  • 26
0

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
-5

It has string formatting Example:

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