字符串插值,如 java.text.MessageFormat for scala.js
String interpolation like java.text.MessageFormat for scala.js
我需要 scala.js 的字符串插值,例如 java.text.MessageFormat
。具体来说,我需要一些东西,让我可以为我们的翻译选择参数的打印顺序(如“{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:_*)
}
您可以将 String.format
与显式索引一起使用:
val world = "world"
"Hello %1$s".format(world)
"Hello %2$s%1$s".format("!", "world")
在 $
之前指定了显式索引。它们是从 1 开始的。
它不如 {x}
漂亮,但如果您真的想要它,您可以定义一个自定义函数,将 {x}
转换为 %x$s
,然后再将它们提供给 format
.
我需要 scala.js 的字符串插值,例如 java.text.MessageFormat
。具体来说,我需要一些东西,让我可以为我们的翻译选择参数的打印顺序(如“{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:_*)
}
您可以将 String.format
与显式索引一起使用:
val world = "world"
"Hello %1$s".format(world)
"Hello %2$s%1$s".format("!", "world")
在 $
之前指定了显式索引。它们是从 1 开始的。
它不如 {x}
漂亮,但如果您真的想要它,您可以定义一个自定义函数,将 {x}
转换为 %x$s
,然后再将它们提供给 format
.