coffeescript版本的string.format,sprintf()等javascript或node.js

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

所以这里有两件事。 首先是插值,其中coffeescript直接支持使用双引号string文字和ruby风格的语法是这样的:

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

这将用本地作用域中的相应variablesreplace占位符。 这是处理coffeescript(和ruby)string插值的惯用方法。

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

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

对于具有C风格的格式化程序的其他function,请查看JavaScript sprintf (我在此答案中find的)

这似乎是诀窍:

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

翻译使用来自fearphage的一些JavaScript

然后可以这样使用:

 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}的方法(虽然完美,例如给出)不能用于需要被回收几次的string。 在一个循环的情况下,例如:

  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