2008-12-03 11 views
5

мне нужно округлить десятичных чисел в шести местах с помощью JavaScript, но мне нужно рассмотреть устаревшие версии браузеров, поэтому я can't rely on Number.toFixedКак написать прототип для Number.toFixed в JavaScript?

Большой улов с toExponential, toFixed и toPrecision является то, что они довольно современные конструкции не поддерживаются в Mozilla до Firefox версии 1.5 (хотя IE поддерживал методы с версии 5.5). Хотя в большинстве случаев безопасно использовать эти методы, старые браузеры будут разбиты, поэтому, если вы пишете общедоступную программу, рекомендуется предоставить свои собственные прототипы, чтобы обеспечить функциональность этих методов для более старого браузера.

Я рассматриваю, используя что-то вроде

Math.round(N*1000000)/1000000 

Что является лучшим способом для обеспечения этого прототипа в старых браузерах?

ответ

15

Попробуйте это:

if (!Number.prototype.toFixed) 

    Number.prototype.toFixed = function(precision) { 
     var power = Math.pow(10, precision || 0); 
     return String(Math.round(this * power)/power); 
    } 
0

Я думаю, что Firefox 1.5 и IE 5 в значительной степени больше не используются или очень незначительным количеством людей.
Это немного похоже на кодирование для поддержки Netscape Navigator ... :-)
Если какой-либо другой главный браузер (Opera? Safari? Маловероятен ...) не поддерживает это, или если ваши веб-журналы показывают много наследия браузером, вы, вероятно, можете просто использовать эти методы.
Когда-нибудь, мы должны двигаться дальше.^_^

[EDIT] Работает хорошо на Opera 9.50 и Safari 3,1

javascript: var num = 3.1415926535897932384; alert(num.toFixed(7)); 

В статье вы ссылаетесь это полтора года назад, вечность в ИТ-индустрии ... Я думаю, что, в отличие от IE пользователи, пользователи Firefox часто переходят к последней версии.

+2

Это не дает ответа на этот вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – 2013-11-13 15:13:08

+2

@PatrickKostjens вам известно, что вы критикуете ответ, полученный 5 лет назад? («вечность в ИТ-индустрии», процитировать себя ...) Если вы планируете критиковать все эти ответы в SO, у вас впереди какая-то работа! :-) Кроме того, это реальный ответ в смысле, что OP не должен заботиться о браузерах, которые уже были устаревшими во время вопроса ... То есть. что его вопрос, вероятно, бессмыслен. – PhiLho 2013-11-14 15:55:37

0

С Bytes website, эта функция почти то же самое, чем Serge llinsky-х:

if (!num.toFixed) 
{ 
    Number.prototype.toFixed = function(precision) 
    { 
    var num = (Math.round(this*Math.pow(10,precision))).toString(); 
    return num.substring(0,num.length-precision) + "." + 
      num.substring(num.length-precision, num.length); 
    } 
} 
0

Другой вариант (который не превращается в строку без необходимости, а также исправляет просчет (162.295) .Fixed (2) до 162,29 (должен быть 162,30)).

Number.prototype._toFixed=Number.prototype.toFixed; //Preserves the current function 
Number.prototype.toFixed=function(precision){ 
/* step 1 */ var a=this, pre=Math.pow(10,precision||0); 
/* step 2 */ a*=pre; //currently number is 162295.499999 
/* step 3 */ a = a._toFixed(2); //sets 2 more digits of precision creating 16230.00 
/* step 4 */ a = Math.round(a); 
/* step 5 */ a/=pre; 
/* step 6 */ return a._toFixed(precision); 
} 
/*This last step corrects the number of digits from 162.3 (which is what we get in
step 5 to the corrected 162.30. Without it we would get 162.3 */

Edit: При попытке это конкретное воплощения, this*=Math.pow(10, precision||0) создает ошибки недопустимого назначения в левом. Таким образом, это ключевое слово имеет переменную a. Это также помогло бы, если бы я закрыл свои функции^_^;;

0

Попробуйте это:

Number.prototype.toFixed = function(precision) { 
    var power = Math.pow(10, precision || 0); 
    return String(Math.round(this * power)/power); 
}