javascript - 字符串插值,如 scala.js 的 java.text.MessageFormat

标签 javascript string scala scala.js string-interpolation

我需要像 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,然后再进行格式化

关于javascript - 字符串插值,如 scala.js 的 java.text.MessageFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52972268/

相关文章:

javascript - 向多个元素添加相同的事件监听器

java - String String Buffer类、String Builder类区别

parsing - 在Scala组合器解析器中忽略C样式的注释

scala - 为什么不让每个 Scala 类都成为一个案例类?

scala - Akka 持久性与确认交付会产生不一致的结果

javascript - 如何更改输入字段的输入类型?

javascript - Bing map 绘图工具模块 - 事件

jquery - 帮助捕获 DIV 中的属性数据排序作为数组吗? Jquery/Javascript

string - 如何使用 bash 在每一行中复制字符串?

Java:使用堆栈检查括号的正确性