Строковая интерполяция, такая как java.text.MessageFormat для scala.js - PullRequest
0 голосов
/ 24 октября 2018

Мне нужна интерполяция строк, такая как java.text.MessageFormat для scala.js.В частности, мне нужно что-то, что позволило бы мне выбрать порядок, в котором печатаются мои параметры (например, «{0}», «{1}») для наших переводов.

Что я хочу:

val world = "world"
format("Hello {0}", world)
format("Hello {1}{0}", "!", world) // should print: "Hello world!"

Что я не могу использовать:

"Hello $world"  
"Hello %s".format(world)

Что-нибудь, что я могу использовать и просто еще не нашел?Для удобства я определенно предпочел бы использовать '{x}' в моих строках.

РЕДАКТИРОВАТЬ:

Используя ответ sjrd, я пришел к следующему:

/**
* String interpolation [[java.text.MessageFormat]] style:
* {{{
*   format("{1} {0}", "world", "hello") // result: "hello world"
*   format("{0} + {1} = {2}", 1, 2, "three") // result: "1 + 2 = three"
*   format("{0} + {0} = {0}", 0) // throws MissingFormatArgumentException
* }}}
* @return
*/
def format (text: String, args: Any*): String = {
   var scalaStyled = text
   val pattern = """{\d+}""".r
   pattern.findAllIn(text).matchData foreach {
      m => val singleMatch = m.group(0)
           var number = singleMatch.substring(1, singleMatch.length - 1).toInt
           // %0$s is not allowed so we add +1 to all numbers
           number = 1 + number
           scalaStyled = scalaStyled.replace(singleMatch, "%" + number + "$s")
   }
   scalaStyled.format(args:_*)
}

1 Ответ

0 голосов
/ 24 октября 2018

Вы можете использовать String.format с явными индексами:

val world = "world"
"Hello %1$s".format(world)
"Hello %2$s%1$s".format("!", "world")

Явные индексы указываются перед $.Они основаны на 1.

Это не так красиво, как {x}, но если вы действительно этого хотите, вы можете определить пользовательскую функцию, которая переводит {x} в %x$s перед тем, как передать их format.

...