2013-04-22 3 views
7

Ho questa semplice funzione:toLocaleString() non supportato in tutti i browser?

Chrome, Firefox, IE:

Number(1000000).toLocaleString() 
"1 000 000" // in french system, the space is the separator instead of the comma 

Opera, Maxthon:

Number(1000000).toLocaleString() 
"1000000" 

perché formato Opera e Maxthon cant? supportano questo metodo ma non lo eseguono nel modo giusto?

c'è qualche sostituzione toLocaleString()?

+1

solo sottolineando che si dovrebbe anche non aspettatevi di uscita uniforme in numero gli utenti '(1000000) .toLocaleString();' 'mi dà "1.000.000"' (Google Chrome, en-GB). Vedi la pagina [** MDN **] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toLocaleString) per quali parametri dovrebbe prendere e in quali browser è supportato . –

+0

@PaulS. mi spiace, ho dimenticato di precisare che uso il sistema operativo francese, e nel sistema francese, la separazione è fatta usando uno spazio al posto della virgola –

+0

sembra che fosse anche assente in Chrome! scusa perché ho pensato che un metodo DEVE sempre restituire un risultato se è lì! –

risposta

3

Il language spec lascia la definizione molto indeterminato:

15.7.4.3 Number.prototype.toLocaleString()

produce un valore String che rappresenta il valore numero formattato in base alle convenzioni della locale corrente del ambiente host. Questa funzione dipende dall'implementazione ed è consentita, ma non incoraggiata, affinché restituisca la stessa cosa di toString.

Diversi browser possono implementarlo in modo diverso e possono implementarlo in modo diverso in base alla locale scelta dall'utente.

+0

quindi non ci sono sostituzioni dirette? devo programmare la formattazione o usare una libreria esterna? –

+1

@AbdelouahabPp, Se hai bisogno di una formattazione numerica identica su tutti i browser, allora sì, devi evitare le funzioni dipendenti dall'implementazione. –

+0

ah grazie, spero che lo implementeranno come rimosso da quella lista;) –

9

Anche l'uscita sarà diversa a seconda delle impostazioni locali dell'utente, anche se Number.prototype.toLocaleString è supportato dal proprio browser, ad es. per me su en-GB, Number(1000000).toLocaleString(); mi dà "1,000,000".

c'è qualche sostituzione toLocaleString()?

Perché non scrivere uno per fare esattamente quello che vuoi? Ad esempio,

function localeString(x, sep, grp) { 
    var sx = (''+x).split('.'), s = '', i, j; 
    sep || (sep = ' '); // default seperator 
    grp || grp === 0 || (grp = 3); // default grouping 
    i = sx[0].length; 
    while (i > grp) { 
     j = i - grp; 
     s = sep + sx[0].slice(j, i) + s; 
     i = j; 
    } 
    s = sx[0].slice(0, i) + s; 
    sx[0] = s; 
    return sx.join('.'); 
} 

Ora

localeString(1000000.00001); 
// "1 000 000.00001" 
+0

ah! quello farà il lavoro! grazie –

+0

perché vengo da pitone, ho pensato che fosse semplice, il metho era quello di invertire la stringa, ma poi invertirla ... ma farà molte linee!in python se vuoi invertire una stringa, fai solo un passo negativo, '" ciao "[:: - 1]' e l'ultimo elemento è quello negativo, per esempio il 'o' sarà' "ciao" [ -1] 'davvero il mondo è difficile da qualcuno che viene da python;) thnk you again –

+2

' 'abc'.split (' '). Reverse(). Join (' ') 'è'' cba'', ma tu avremmo ancora bisogno di collegarci in questo modo. Semplicemente annulla invece. Inoltre, ''abc'.slice (-1)' è '' c''. –