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)
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)
如果您使用的是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)
| 归档时间: |
|
| 查看次数: |
40176 次 |
| 最近记录: |