56 votes

Meilleur formatage des chaînes dans Scala

Avec trop d'arguments, String.format facilement devient trop confus. Est-il un moyen plus puissant pour formater une Chaîne de caractères. Comme suit:

"This is #{number} string".format("number" -> 1)

Ou n'est-ce pas possible en raison du type de questions (format , il faudrait prendre une Carte[Chaîne de caractères, de Tout], je suppose; ne sais pas si ce serait rendre les choses encore pire).

Ou est la meilleure façon de le faire comme ceci:

val number = 1
<plain>This is { number } string</plain> text

même s'il pollue l'espace de nom?

Edit:

Alors qu'un simple proxénétisme pourrait le faire dans de nombreux cas, je suis également à la recherche de quelque chose allant dans le même sens que Python format() (Voir: http://docs.python.org/release/3.1.2/library/string.html#formatstrings)

75voto

Andrej Herich Points 697

Dans Scala 2.10, vous pouvez utiliser une interpolation de chaîne .

 val height = 1.9d
val name = "James"
println(f"$name%s is $height%2.2f meters tall")  // James is 1.90 meters tall
 

38voto

Daniel C. Sobral Points 159554

Eh bien, si votre seul problème est de rendre plus souple la commande des paramètres, vous pouvez le faire facilement:

 scala> "%d %d" format (1, 2)
res0: String = 1 2

scala> "%2$d %1$d" format (1, 2)
res1: String = 2 1
 

Et il y a aussi le remplacement de regex à l'aide d'une carte:

 scala> val map = Map("number" -> 1)
map: scala.collection.immutable.Map[java.lang.String,Int] = Map((number,1))

scala> val getGroup = (_: scala.util.matching.Regex.Match) group 1
getGroup: (util.matching.Regex.Match) => String = <function1>

scala> val pf = getGroup andThen map.lift andThen (_ map (_.toString))
pf: (util.matching.Regex.Match) => Option[java.lang.String] = <function1>

scala> val pat = "#\\{([^}]*)\\}".r
pat: scala.util.matching.Regex = #\{([^}]*)\}

scala> pat replaceSomeIn ("This is #{number} string", pf)
res43: String = This is 1 string
 

17voto

Ruediger Keller Points 1629

Peut-être que le plugin Scala-Enhanced-Strings peut vous aider. Regardez ici:

Scala-Enhanced-Strings-Plugins Documentation

15voto

Vasil Remeniuk Points 12487

Vous pouvez facilement implémenter vous-même un formatage plus riche (avec une approche pimp-my-library):

 scala> implicit def RichFormatter(string: String) = new {
     |   def richFormat(replacement: Map[String, Any]) =
     |     (string /: replacement) {(res, entry) => res.replaceAll("#\\{%s\\}".format(entry._1), entry._2.toString)}
     | }
RichFormatter: (string: String)java.lang.Object{def richFormat(replacement: Map[String,Any]): String}

scala> "This is #{number} string" richFormat Map("number" -> 1)
res43: String = This is 1 string
 

2voto

Dom Points 897

Vous pouvez également envisager l'utilisation d'un moteur de gabarit pour les chaînes très complexes et longues. Sur le dessus de ma tête, j'ai Scalate qui implémente, entre autres, le moteur de template Moustache .

Peut-être un excès et une perte de performance pour des chaînes simples, mais vous semblez être dans cette zone où elles commencent à devenir de véritables modèles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X