Format dans les modèles de chaîne kotlin

199

Kotlin a une excellente fonctionnalité appelée modèles de chaînes. Je l'aime vraiment.

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

Mais est-il possible d'avoir une mise en forme dans les modèles? Par exemple, je voudrais formater Double dans des modèles de chaîne en kotlin, au moins pour définir un nombre de chiffres après un séparateur décimal:

val pi = 3.14159265358979323
val s = "pi = $pi??" // How to make it "pi = 3.14"?
MajesticRa
la source
Existe-t-il une solution multiplateforme à cela?
KenIchi

Réponses:

248

Malheureusement, il n'y a pas encore de support intégré pour le formatage dans les modèles de chaîne, comme solution de contournement, vous pouvez utiliser quelque chose comme:

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

la .format(n)fonction dont vous auriez besoin pour vous définir

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

Il y a clairement un élément de fonctionnalité qui manque à Kotlin pour le moment, nous allons le corriger.

Andrey Breslav
la source
7
Est-ce disponible maintenant?
Ragunath Jawahar
4
@RagunathJawahar, la réponse est toujours à jour, nous ne l'avons pas encore amélioré
Andrey Breslav
3
@AndreyBreslav Et maintenant? Est-ce disponible?
cihan adil sept
37
Suis-je dans l'erreur ou n'est-ce toujours pas disponible près de 4 ans plus tard?
Warkst
6
Ajoutez-le comme cadeau du Nouvel An pour 2020!
marquez le
132

Comme solution de contournement, il existe une fonction stdlib de Kotlin qui peut être utilisée de manière agréable et entièrement compatible avec le format String de Java (ce n'est qu'un wrapper autour de JavaString.format() )

Voir la documentation de Kotlin

Votre code serait:

val pi = 3.14159265358979323
val s = "pi = %.2f".format(pi)
akhy
la source
2
Je suppose qu'il voulait dire cette documentation: docs.oracle.com/javase/8/docs/api/java/lang/…
stuckj
@Rob Voir aussi la discussion sur la documentation
Matt Mc
Fonctionne dans Kotlin 1.3.21
FP Librement le
28

La classe String de Kotlin a maintenant une fonction de formatage , qui utilise en interne la String.formatméthode 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)

Usage

val pi = 3.14159265358979323
val formatted = String.format("%.2f", pi) ;
println(formatted)
>>3.14
user1767754
la source
1
String.Companion.format est introuvable dans Kotlin v1.2.21. Quelle est l'alternative?.
Sai
19

C'est simple, utilisez:

val str:String = "%.2f".format(3.14159)
masoomyf
la source
3

Étant donné qu'il String.formatne s'agit que d'une fonction d'extension (voir ici ) qui appelle en interne, java.lang.String.formatvous pouvez écrire votre propre fonction d'extension en utilisant DecimalFormat de Java si vous avez besoin de plus de flexibilité:

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
la source
0

Quelques exemples:

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}")
Alexander Logger
la source