【发布时间】:2012-03-26 22:06:06
【问题描述】:
如何在 coffeescript 中使用 string.format() 或 sprintf()?
【问题讨论】:
标签: node.js coffeescript printf string.format
如何在 coffeescript 中使用 string.format() 或 sprintf()?
【问题讨论】:
标签: node.js coffeescript printf string.format
所以这里发生了两件事。首先是插值,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.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
【讨论】:
已接受答案的惯用版本:
String::format = (args...) ->
@replace /{(\d+)}/g, (match, number) ->
if number < args.length then args[number] else match
【讨论】: