복붙노트

[SCALA] 더 나은 문자열 스칼라에 서식

SCALA

더 나은 문자열 스칼라에 서식

너무 많은 인수가, 및 String.format는 너무 쉽게 혼동됩니다. 문자열을 포맷 할 수있는보다 강력한 방법이있다. 그래서 같이 :

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

또는 때문에 유형의 문제로이 불가능합니다 (형식, 나는 생각지도 [문자열, 어떤]을해야합니다, 이것은 나쁜 일을 만들 것인지 모른다).

또는 다음과 같이 그 일을 더 나은 방법입니다 :

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

이 이름 공간을 오염에도 불구하고?

편집하다:

http://docs.python.org/release/3.1.2/library/string : 간단한의 포주가 많은 경우에 할 수도 있지만, 나는 또한 파이썬의 형식 () (참고로 같은 방향으로가는 뭔가를 찾고 있어요. HTML # formatstrings)

해결법

  1. ==============================

    1.스칼라 2.10에서는 문자열 보간을 사용할 수 있습니다.

    스칼라 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
    
  2. ==============================

    2.유일한 문제는보다 유연한 매개 변수의 순서를 만드는 경우 음은이 쉽게 수행 할 수 있습니다 :

    유일한 문제는보다 유연한 매개 변수의 순서를 만드는 경우 음은이 쉽게 수행 할 수 있습니다 :

    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
    
  3. ==============================

    3.아마 스칼라 - 강화 된 - 문자열 - 플러그인은 당신을 도울 수 있습니다. 이봐:

    아마 스칼라 - 강화 된 - 문자열 - 플러그인은 당신을 도울 수 있습니다. 이봐:

    스칼라 - 강화 된 - 문자열 - 플러그인 문서

  4. ==============================

    4.당신은 쉽게 부자가 (포주 - 내 - 라이브러리 접근) 자신의 서식을 구현할 수 있습니다 :

    당신은 쉽게 부자가 (포주 - 내 - 라이브러리 접근) 자신의 서식을 구현할 수 있습니다 :

    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
    
  5. ==============================

    5.이 응답 나는이 찾고있는 사람이 여기 온 :

    이 응답 나는이 찾고있는 사람이 여기 온 :

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

    6.당신은 2.10를 사용하는 경우 다음 보간에 내장과 함께 할 것입니다. 당신이 극단적 인 성능에 대해 신경 쓰지 및 기능 한 라이너를 두려워하지 않는 경우 그렇지 않으면, 당신은 + 여러 정규 표현식 검사를 접어 사용할 수 있습니다 :

    당신은 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 ))
    
  7. ==============================

    7.또한 정말 복잡하고 긴 문자열을위한 템플릿 엔진의 사용을 고려할 수 있습니다. 내 머리 꼭대기에 나는 다른 사람의 사이에 Scalate하는 구현하는 콧수염 템플릿 엔진을 가지고있다.

    또한 정말 복잡하고 긴 문자열을위한 템플릿 엔진의 사용을 고려할 수 있습니다. 내 머리 꼭대기에 나는 다른 사람의 사이에 Scalate하는 구현하는 콧수염 템플릿 엔진을 가지고있다.

    과잉 간단한 문자열에 대한 성능 손실 될 수 있지만 당신은 그들이 실제 템플릿되기 시작 그 지역에있는 것으로 보일 수 있습니다.

  8. from https://stackoverflow.com/questions/4051308/better-string-formatting-in-scala by cc-by-sa and MIT license