2013-04-22 2 views
7

я эту простую функцию:toLocaleString() не поддерживается во всех браузерах?

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" 

почему формат Opera и Maxthon косяк это? они поддерживают этот метод, но не выполняют его правильно?

есть ли toLocaleString() замена?

+1

Просто указывая на то, что вы также не должны ожидать равномерного вывода через ваших пользователей 'Number (1000000.) .toLocaleString();' 'дает мне "1000000"' (Google Chrome, ru-RU). См. Страницу [** MDN **] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toLocaleString), для каких параметров она должна выполняться и в каких браузерах она поддерживается , –

+0

@PaulS. извините, забыли точно, что я использую французскую ОС, а во французской системе разделение выполняется с использованием пробела вместо запятой –

+0

кажется, что он также отсутствовал в Chrome! извините, потому что я думал, что метод ДОЛЖЕН всегда возвращать результат, если он есть! –

ответ

3

language spec оставляет определение очень открытого состава:

15.7.4.3 Number.prototype.toLocaleString()

Создает строковое значение, представляющее это числовое значение, отформатированный в соответствии с текущим языковым настройкам среды. Эта функция зависит от реализации, и это допустимо, но не рекомендуется, чтобы она возвращала то же самое, что и toString.

Различные браузеры имеют возможность реализовать его по-разному и могут реализовать его по-разному в зависимости от выбранного пользователем языка.

+0

, так что нет прямой замены? я должен запрограммировать форматирование или использовать внешнюю библиотеку? –

+1

@AbdelouahabPp. Если вам нужно одинаковое форматирование чисел во всех браузерах, то да, вам нужно избегать функций, зависящих от реализации. –

+0

ах спасибо, надеюсь, они будут реализовывать его как удалены из этого списка;) –

9

Выход будет также отличаться в зависимости от настроек локали пользователя, даже если Number.prototype.toLocaleString поддерживается их браузером, например. для меня на ru-RU, Number(1000000).toLocaleString(); дает мне "1,000,000".

есть ли toLocaleString() замена?

Почему бы не написать одно, чтобы сделать именно то, что вы хотите? Например,

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('.'); 
} 

Теперь

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

ах! что сделает эту работу! спасибо –

+0

, потому что я прихожу из python, я думал, что это просто, metho должен был инвертировать stringm forat, а затем повторно инвертировать его ... но он будет делать много строк!в python, если вы хотите инвертировать строку, вы просто делаете отрицательный шаг «hello» [:: - 1] ', а последний элемент является отрицательным, например' o' будет '' hello "[ -1] 'действительно мир тяжело от кого-то из python;) thnk you again –

+2

' 'abc'.split (''). Reverse(). Join ('')' is ''cba'', но вы все равно нужно было бы обдумать это. Просто зацикливайтесь. Кроме того, '' abc'.slice (-1) 'is' 'c''. –

Смежные вопросы