2014-04-21 15 views
6

Quindi stavo scrivendo un piccolo metodo di supporto per convertire i numeri in un formato di denaro valido ($xx,xxx.xx) utilizzando .toLocaleString(). Tutto funziona come previsto quando lo si utilizza in Chrome, tuttavia sembra completamente danneggiato quando si utilizza Node.js.Utilizzo di .toLocaleString() in Node.js

Esempio:

var n = 6000 
console.log(n.toLocaleString('USD', { 
    style: 'currency', 
    currency: "USD", 
    minimumFractionDigits : 2, 
    maximumFractionDigits : 2 
})); 

Se si esegue questo nel browser, esso stampa $6,000.00. Se si esegue questo snippet all'interno di Node.js REPL o dell'applicazione, restituisce 6000 come stringa.

Indovinare che si tratta di un errore di Node.js? C'è un lavoro intorno a te che potresti fare qui?

+0

Dai un'occhiata a http://stackoverflow.com/questions/17935594/can-i-get-node-to-output-commas-in-number-strings-without-bringing-in-i18n fanno riferimento a problema github che sembra suggerire che si tratta di un bug/funzionalità poiché non vogliono includere il supporto i18n per impostazione predefinita. È comunque possibile compilare la propria versione del nodo con supporto incluso se è importante per te. – TheShellfishMeme

+0

@TheShellfishMeme Buona cattura! Non è al 100%, ma posso modificarlo per funzionare per quello di cui ho bisogno. –

risposta

13

In base a this issue sembra che fosse stato deciso che la spedizione di node.js con l'internazionalizzazione lo avrebbe reso troppo grande. Puoi richiedere npm install intl e sostituirà toLocaleString con una versione che funziona.

+0

Sfortunatamente 'intl''s' .toLocaleString() 'aggiunge 'US' all'inizio degli importi restituiti. ('US $ 50.000,00') –

+0

@ Dropped.on.Caprica È possibile' .toLocaleString (...). Slice (2) 'per sbarazzarsi di quelli. O utilizzare una funzione personalizzata; dipende da quanto altro uso uscirai da 'intl'. –

+1

Onestamente sono sicuro al 90% che vado con qualcosa di personalizzato.Aggiungere una soluzione alternativa a una soluzione alternativa non è ottimale, in più non ottengo altro uso reale di 'intl' diverso da un metodo fisso' .toLocaleString() '. Grazie per il suggerimento su 'intl' però. –

3

Nel caso in cui qualcun altro si imbatta in questo, ecco come ho formattato un numero in una stringa di dollaro USA valida in un ambiente Node.js.

Number.prototype.toMoney = function() { 
    var integer = this.toString().split('.')[0]; 
    var decimal = this.getDecimal(); 

    integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ","); 

    if(!decimal || !decimal.length) { 
    decimal = "00"; 
    } else if (decimal.length === 1) { 
    decimal += '0'; 
    } else if (decimal.length > 2) { 
    decimal = decimal.substr(0, 2); 
    } 

    return '$' + integer + '.' + decimal; 
}; 

Number.prototype.getDecimal = function() { 
    var n = Math.abs(this); 
    var dec = n - Math.floor(n); 
    dec = (Math.round(dec * 100)/100).toString(); 

    if(dec.split('.').length) { 
    return dec.split('.')[1]; 
    } else return ""; 
}; 

Ci sono alcuni boo-boo è qui, vale a dire l'estensione del nativo Number prototipo. Volete evitare questo è il 90% delle volte; questo è più specifico per la mia particolare implementazione.

Ho chiaramente rubato il regex per la formattazione delle virgole da this question. e ha hackerato insieme il supporto decimale della mia stessa volontà. Il chilometraggio può variare.

0

Quindi, per aggiornare questo per chiunque di fronte lo stesso problema ...

avevamo usato intl per la nostra soluzione di localizzazione quando il rendering lato server, ma di recente abbiamo avuto l'obbligo di aggiungere {timeZoneName: 'short'} ai nostri .toLocaleString() opzioni e questo campo non è supportato.

codice sorgente da intl.js:

case 'timeZoneName': 
    fv = ''; // ###TODO 
    break; 

Inoltre, c'è stato un cambiamento di rottura nella versione più recente patch che ci ha costretti a bloccare la nostra versione a 1.2.4.

In definitiva, abbiamo abbandonato l'utilizzo di intl in favore di full-icu. Semplicemente aggiungendolo al nostro thread.lock risolto tutti i nostri problemi di localizzazione della data lato server Node.js. Non ho verificato la localizzazione della valuta, ma finora è andata così bene. Consiglio di provarlo.

Problemi correlati