Làm thế nào để string.format() hoặc sprintf() trong coffeescript?phiên bản coffeescript của string.format, sprintf() v.v. cho javascript hoặc node.js
Trả lời
Điều này dường như làm lừa:
String.prototype.format = ->
args = arguments
return this.replace /{(\d+)}/g, (match, number) ->
return if typeof args[number] isnt 'undefined' then args[number] else match
dịch sử dụng một số javascript from fearphage
nào sau đó có thể được sử dụng như thế này:
fmt = "<p>{0} {1} (<a href='mailto:{2}'>{2}</a>)</p>"
mystring = fmt.format "Fred", "Flinstone", "[email protected]"
mystring sau đó sẽ là:
<p>Fred Flinstone (<a href='mailto:[email protected]'>[email protected]</a>)</p>
Sử dụng # {var} cách tiếp cận (trong khi hoàn hảo cho ví dụ đưa ra) không làm việc với một chuỗi mà cần phải được tái chế nhiều lần. Trong một tình huống lặp ví dụ:
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
Vì vậy, có 2 điều đang diễn ra ở đây. Đầu tiên là nội suy, mà coffeescript trực tiếp hỗ trợ sử dụng xâu dụng dấu ngoặc kép và cú pháp phong cách ruby như thế này:
"The #{speed} #{color} #{animal} jumped over the lazy dog"
Điều đó sẽ thay thế placeholders với các biến tương ứng từ phạm vi địa phương. Đó là cách thành ngữ để xử lý nội suy chuỗi trong coffeescript (và ruby). Thứ hai là định dạng mà bạn có thể nên xử lý riêng nếu bạn muốn lấy số có chữ số thập phân cụ thể, hàng nghìn riêng biệt bằng dấu phẩy, số 0 đứng đầu hoặc loại điều đó. Tuy nhiên, CoffeeScript thể suy nguyên định dạng tốt, vì vậy bạn có thể làm
"Free shipping on orders over #{currency(freeShipAmount)}"
Đối với các tính năng khác với trình định dạng C-phong cách, có một cái nhìn tại JavaScript sprintf (mà tôi tìm thấy trên this answer)
Điểm tốt - Cảm ơn bạn đã nhắc tôi giải thích tại sao tôi lại cố gắng tìm một giải pháp string.format() thay vì sử dụng ".... # {var} ...." – jiy
Coffe Script có cú pháp đặc biệt để dẫn đầu số không? –
Không, kịch bản coffe có nội suy các biểu thức tùy ý thành chuỗi ký tự. Không có hỗ trợ đặc biệt cho việc định dạng dữ liệu trong coffeescript trực tiếp. Sử dụng bất kỳ thư viện javascript nào để thực hiện định dạng và sau đó coffeescript để nội suy. –
Phiên bản ngữ của câu trả lời được chấp nhận:
String::format = (args...) ->
@replace /{(\d+)}/g, (match, number) ->
if number < args.length then args[number] else match
Đây có phải là một câu hỏi? –