Scala中更好的字符串格式

Deb*_*ski 55 string formatting scala string-formatting

有太多的争论,String.format很容易让人感到困惑.是否有更强大的格式化String的方法.像这样:

"This is #{number} string".format("number" -> 1)
Run Code Online (Sandbox Code Playgroud)

或者这是不可能的,因为类型问题(format需要采取Map [String,Any],我假设;不知道这是否会使事情变得更糟).

或者更好的方式是这样做:

val number = 1
<plain>This is { number } string</plain> text
Run Code Online (Sandbox Code Playgroud)

即使它污染名称空间?

编辑:

虽然在许多情况下可能会有一个简单的拉皮条,但我也在寻找与Python相同方向的东西format()(参见:http://docs.python.org/release/3.1.2/library/string.html#formatstrings)

And*_*ich 72

在Scala 2.10中,您可以使用字符串插值.

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


Dan*_*ral 38

好吧,如果您唯一的问题是使参数的顺序更灵活,这可以很容易地完成:

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

scala> "%2$d %1$d" format (1, 2)
res1: String = 2 1
Run Code Online (Sandbox Code Playgroud)

并且在地图的帮助下还可以替换正则表达式:

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
Run Code Online (Sandbox Code Playgroud)


Rue*_*ler 17

也许Scala-Enhanced-Strings-Plugin可以帮到你.看这里:

Scala-Enhanced-Strings-Plugin文档


Vas*_*iuk 15

您可以轻松地自己实现更丰富的格式化(使用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
Run Code Online (Sandbox Code Playgroud)


Pri*_*sai 14

这个答案我来到这里寻找:

"This is %s string".format(1)
Run Code Online (Sandbox Code Playgroud)


Ald*_*chi 5

如果您使用的是2.10,请使用内置插值。否则,如果您不关心极端的性能并且不担心功能单一的衬里,则可以使用fold +几个正则表达式扫描:

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