it-swarm-ko.tech

Scala의 더 나은 문자열 형식

인수가 너무 많으면 String.format가 너무 혼란스러워집니다. 문자열을 포맷하는 더 강력한 방법이 있습니까? 이렇게 :

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

또는 유형 문제로 인해 이것이 불가능합니까 (format는 Map [String, Any]를 가져와야합니다. 이것이 더 나빠질 지 모르겠습니다).

또는 다음과 같이하는 것이 더 좋은 방법입니다.

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

이름 공간을 오염 시키지만?

편집 :

간단한 포주가 많은 경우에 도움이 될 수도 있지만, 파이썬의 format()과 같은 방향으로 가고있는 것을 찾고 있습니다. http://docs.python.org/release/ 3.1.2/library/string.html # formatstrings )

55
Debilski

Scala 2.10에서 string interpolation 을 사용할 수 있습니다.

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

글쎄, 유일한 문제가 매개 변수의 순서를보다 유연하게 만드는 것이라면 쉽게 수행 할 수 있습니다.

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

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

그리고 맵의 도움으로 정규식 대체가 있습니다.

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
38
Daniel C. Sobral

아마도 Scala-Enhanced-Strings-Plugin이 도움이 될 것입니다. 이봐:

Scala-Enhanced-Strings-Plugin Documentation

17
Ruediger Keller

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
14
Vasil Remeniuk

이것이 내가 찾은 대답은 다음과 같습니다.

"This is %s string".format(1)
9
Priyank Desai

2.10을 사용하는 경우 내장 보간으로 이동하십시오. 그렇지 않으면, 극한의 성능에 신경 쓰지 않고 기능적인 원 라이너를 두려워하지 않으면 폴드 + 여러 정규 표현식 스캔을 사용할 수 있습니다.

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

매우 복잡하고 긴 문자열에 템플릿 엔진을 사용할 수도 있습니다. 내 머리 위에 Mcalache 템플릿 엔진을 구현하는 Scalate 이 있습니다.

간단한 문자열의 경우 과도한 성능과 성능 손실이 발생할 수 있지만 실제 템플릿이되기 시작하는 영역에있는 것 같습니다.

2
Dominik Bucher