Kotlin possède 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 un formatage dans les modèles? Par exemple, j'aimerais formater Double dans des modèles de chaîne dans kotlin, tout 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"?
Malheureusement, il n’existe pas encore de prise en charge intégrée du formatage dans les modèles de chaîne. En guise de solution de contournement, vous pouvez utiliser quelque chose comme:
"pi = ${pi.format(2)}"
la fonction .format(n)
dont vous auriez besoin pour vous définir comme
fun Double.format(digits: Int) = Java.lang.String.format("%.${digits}f", this)
Il y a clairement une fonctionnalité qui manque ici à Kotlin pour le moment, nous allons la réparer.
En guise de solution de contournement, Il existe une fonction Kotlin stdlib qui peut être utilisée de manière conviviale et parfaitement compatible avec le format String de Java (il ne s'agit que d'une enveloppe autour de la String.format()
de Java).
Votre code serait:
val pi = 3.14159265358979323
val s = "pi = %.2f".format(pi)
La classe String de Kotlin a maintenant une fonction format qui utilise en interne la méthode 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)
Usage
val pi = 3.14159265358979323
val formatted = String.format("%.2f", pi) ;
println(formatted)
>>3.14
C'est simple, Utilisez:
val str:String = "%.2f".format(3.14159)
Étant donné que String.format
est uniquement une fonction d'extension (voir here ) qui appelle Java.lang.String.format
en interne, vous pouvez écrire votre propre fonction d'extension à l'aide de 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
Un grand nombre de réponses font référence à String.format et aux informations associées, mais pas à la position correcte dans la dernière branche principale. Pour référence, this est où il se trouve maintenant.