2012-03-26 15 views

Odpowiedz

4

Wydaje się to zrobić trick:

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

przelicza się przy zastosowaniu niektórych javascript from fearphage

które następnie mogą być wykorzystane tak:

fmt = "<p>{0} {1} (<a href='mailto:{2}'>{2}</a>)</p>" 
mystring = fmt.format "Fred", "Flinstone", "[email protected]" 

mystring będzie wówczas:

<p>Fred Flinstone (<a href='mailto:[email protected]'>[email protected]</a>)</p> 

Korzystanie z # {var} podejście (na przykład podczas idealny podany) nie działa z ciągiem, które muszą być poddane recyklingowi kilkakrotnie. W pętli sytuacji na przykład:

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 
15

Tak więc dzieje się tutaj 2 rzeczy. Pierwszym z nich jest interpolacja, który coffeescript bezpośrednio wspiera stosowanie podwójnych cytowany literały ciągów i składnię stylu rubin tak:

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

który zastąpi zastępcze z odpowiednimi zmiennymi z zakresu lokalnego. To jest idiomatyczny sposób na obsługę interpolacji napisów w coffeescript (i ruby).

Drugie to formatowanie, które prawdopodobnie powinno być obsługiwane osobno, jeśli chcesz uzyskać liczby z określonymi miejscami dziesiętnymi, tysiące oddzielone przecinkami, zera wiodącymi lub podobnymi rzeczami. Jednak coffeescript można interpolować formatowanie, tak więc można zrobić

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

dla innych cech z formatujących stylu C, rzucić okiem na JavaScript sprintf (który znalazłem na this answer)

+0

Dobra sprawa - dziękuję za przypomnienie, że próbuję znaleźć rozwiązanie string.format() zamiast ".... # {var} ...." – jiy

+0

Czy Coffe Script ma specjalną składnię dla wiodących zera? –

+0

Nie, skrypt coffe zawiera interpolację dowolnych wyrażeń do literałów łańcuchowych. Nie ma specjalnego wsparcia dla formatowania danych bezpośrednio w coffeescript. Użyj dowolnej biblioteki javascript do formatowania, a następnie do interpolowania coffeescript. –

2

idiomatyczne wersji zaakceptowanej odpowiedzi:

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