версия coffeescript для string.format, sprintf () и т. д. для javascript или node.js - PullRequest
8 голосов
/ 27 марта 2012

Как мне использовать string.format () или sprintf () в coffeescript?

Ответы [ 3 ]

15 голосов
/ 27 марта 2012

Итак, здесь происходит 2 вещи. Во-первых, это интерполяция, которую coffeescript напрямую поддерживает, используя строковые литералы в двойных кавычках и синтаксис в стиле ruby, например:

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

Это заменит заполнители соответствующими переменными из локальной области видимости. Это идиоматический способ обработки интерполяции строк в coffeescript (и ruby).

Второе - это форматирование, которое вам, вероятно, следует обрабатывать отдельно, если вы хотите получить числа с определенными десятичными знаками, тысячи, разделенные запятыми, ведущими нулями или чем-то подобным. Однако CoffeeScript также может интерполировать форматирование, поэтому вы можете сделать

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

Для других функций с форматерами в стиле C, посмотрите JavaScript sprintf (который я нашел в этот ответ )

4 голосов
/ 10 января 2013

Это, кажется, делает трюк:

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 от 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
2 голосов
/ 31 июля 2014

Идиоматическая версия принятого ответа:

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