Мне нужна интерполяция строк, такая как 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:_*)
}