separador porcentaje numero net miles formato dar characters string scala formatting string-formatting

porcentaje - string.format separador miles c#



Mejor formato de cadena en Scala (7)

Bueno, si su único problema es hacer que el orden de los parámetros sea más flexible, esto se puede hacer fácilmente:

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

Y también hay reemplazo de expresiones regulares con la ayuda de un mapa:

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

Con demasiados argumentos, String.format fácilmente se vuelve demasiado confuso. ¿Hay una manera más poderosa para formatear una cadena. Al igual que:

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

O esto no es posible debido a problemas de tipo (el format debería tomar un Mapa [Cadena, Cualquiera], supongo; no sé si esto empeoraría las cosas).

O es la mejor manera de hacerlo así:

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

¿A pesar de que contamina el espacio de nombres?

Editar:

Mientras que un simple proxenetismo podría hacer en muchos casos, también estoy buscando algo que vaya en la misma dirección que el format() de Python format() (Ver: http://docs.python.org/release/3.1.2/library/string.html#formatstrings )


En Scala 2.10 puedes usar interpolación de cadenas .

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


Esta es la respuesta que vine aquí buscando:

"This is %s string".format(1)


Puede implementar fácilmente un formato más rico (con el enfoque 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


Si está utilizando 2.10, vaya con la interpolación incorporada. De lo contrario, si no le importa el rendimiento extremo y no le teme a las líneas simples funcionales, puede usar un doblez + varios análisis de expresiones regulares:

val template = "Hello #{name}!" val replacements = Map( "name" -> "Aldo" ) replacements.foldLeft(template)((s:String, x:(String,String)) => ( "#//{" + x._1 + "//}" ).r.replaceAllIn( s, x._2 ))



También puede considerar el uso de un motor de plantillas para cadenas realmente complejas y largas. En la parte superior de mi cabeza tengo Scalate que implementa, entre otros, el motor de plantillas de Mustache .

Podría ser una exageración y una pérdida de rendimiento para cadenas simples, pero parece que estás en esa área donde comienzan a convertirse en plantillas reales.