Formato en templates de cadenas kotlin

Kotlin tiene una excelente característica llamada templates de strings. Me encanta de verdad.

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

Pero, ¿es posible tener algún formatting en las templates? Por ejemplo, me gustaría formatear el doble en templates de cadena en kotlin, al less para establecer un número de dígitos después de un separador decimal:

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

Desafortunadamente, aún no hay soporte integrado para formatear en templates de cadenas, como solución alternativa, puede usar algo como:

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

la function .format(n) que necesitarías para definirte a ti mismo como

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

Claramente hay una funcionalidad que falta en Kotlin en este momento, la arreglaremos.

Como solución alternativa, existe una function Kotlin stdlib que se puede utilizar de una forma agradable y totalmente compatible con el formatting String de Java (es solo un contenedor de String.format() de Java String.format() .

Tu código sería:

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

La class String de Kotlin ahora tiene una function de formatting , que internamente usa el método String.format de Java:

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

Uso

 val pi = 3.14159265358979323 val formatted = String.format("%.2f", pi) ; println(formatted) >>3.14 

Como String.format es solo una function de extensión (ver aquí ) que internamente llama a java.lang.String.format usted puede escribir su propia function de extensión usando DecimalFormat de Java si necesita más flexibilidad:

 fun Double.format(fracDigits: Int): String { val df = DecimalFormat() df.setMaximumFractionDigits(fracDigits) return df.format(this) } println(3.14159.format(2)) // 3.14 
  • ¿Es posible recuperar la cadena dentro de la expresión lambda?
  • Plantillas que escapan en cadenas multilínea Kotlin
  • ¿Cómo puedo filtrar un valor de una list de arrays en Kotlin?
  • El button onClick no tiene atributo si la actividad está escrita en Kotlin
  • Obtener plural y solo de la unidad de Chrono Time
  • ¿Cómo puedo hacer para con muchas variables
  • ¿Puedo crear un método de extensión Kotlin para agregar una suscripción rxJava a una suscripción compuesta?
  • Falló Kotlin Kapt: solo ve las fonts de api de Android de nivel 1
  • El estudio de Android no resuelve las classs escritas en Kotlin (.kt) en el IDE, pero comstack bien
  • ¿Tiene Kotlin una syntax para los literales de Map?
  • Diferencia de tipo inesperada entre el código equivalente de Java y Kotlin Stream