【问题标题】:coffeescript version of string.format, sprintf() etc. for javascript or node.js用于 javascript 或 node.js 的 string.format、sprintf() 等的咖啡脚本版本
【发布时间】:2012-03-26 22:06:06
【问题描述】:

如何在 coffeescript 中使用 string.format() 或 sprintf()?

【问题讨论】:

    标签: node.js coffeescript printf string.format


    【解决方案1】:

    所以这里发生了两件事。首先是插值,coffeescript 直接支持使用双引号字符串文字和 ruby​​ 样式语法,如下所示:

    "The #{speed} #{color} #{animal} jumped over the lazy dog"
    

    这将用本地范围内的相应变量替换占位符。这是在 coffeescript(和 ruby​​)中处理字符串插值的惯用方式。

    其次是格式,如果您想获得具有特定小数位的数字、用逗号分隔的千位、前导零或类似的东西,您可能应该单独处理它。但是,CoffeeScript 也可以插入格式,所以你可以这样做

    "Free shipping on orders over #{currency(freeShipAmount)}"
    

    有关 C 样式格式化程序的其他功能,请查看 JavaScript sprintf(我在 this answer 上找到的)

    【讨论】:

    • 好点 - 感谢您提醒我解释为什么我试图找到一个 string.format() 解决方案而不是使用 "....#{var}...."
    • Coffe 脚本是否对前导零有特殊语法?
    • 不,coffe 脚本将任意表达式插值到字符串文字中。直接在coffeescript 中没有对数据格式的特殊支持。使用任何 javascript 库进行格式化,然后使用 coffeescript 进行插值。
    【解决方案2】:

    这似乎可以解决问题:

    String.prototype.format = ->
      args = arguments
      return this.replace /{(\d+)}/g, (match, number) ->
        return if typeof args[number] isnt 'undefined' then args[number] else match
    

    使用一些javascript from fearphage翻译

    然后可以这样使用:

    fmt = "<p>{0} {1} (<a href='mailto:{2}'>{2}</a>)</p>"
    mystring = fmt.format "Fred", "Flinstone", "fflinstone@bedrock.gov"
    

    mystring 将是:

    <p>Fred Flinstone (<a href='mailto:fflinstone@bedrock.gov'>fflinstone@bedrock.gov</a>)</p>
    

    使用 #{var} 方法(虽然给出了完美的示例)不适用于需要多次回收的字符串。例如在循环情况下:

      HTML_header       = fs.readFileSync('includes/notify/header.html').toString()
      HTML_managerOpen  = fs.readFileSync('includes/notify/managerOpen.html').toString()
      HTML_student      = fs.readFileSync('includes/notify/student.html').toString()
      HTML_managerClose = fs.readFileSync('includes/notify/managerClose.html').toString()
      HTML_footer       = fs.readFileSync('includes/notify/footer.html').toString()
    
    HTML_final = HTML_header
    
       getter2 = (r, callback) ->
          HTML_final += HTML_managerOpen.format r.EMAIL, r.FNAME, r.LNAME, r.STUDENTS.length, r.PHONE, r.MEMAIL, r.MFNAME, r.MLNAME
          async.forEachSeries r.STUDENTS, getter3, (err) ->
            HTML_final += HTML_managerClose
            callback null
    
        getter3 = (r, callback) ->
          HTML_final += HTML_student.format r.EMAIL, r.FNAME, r.LNAME, r.PHONE, r.DESCRIPTION, r.ENROLLED, "", "", "", "", "", "", r.CERTEXAMSCORE, r.COIKEY
          callback null
    
    async.forEachSeries results, getter2, (err) ->
      cback null, HTML_final + HTML_footer
    

    【讨论】:

      【解决方案3】:

      已接受答案的惯用版本:

      String::format = (args...) ->
        @replace /{(\d+)}/g, (match, number) ->
          if number < args.length then args[number] else match
      

      【讨论】:

        猜你喜欢
        • 2011-11-27
        • 1970-01-01
        • 2012-08-26
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多