Как написать прототип для Number.toFixed в JavaScript? - PullRequest
5 голосов
/ 03 декабря 2008

Мне нужно округлить десятичные числа до шести мест с помощью JavaScript, но мне нужно рассмотреть устаревшие браузеры, чтобы я не мог полагаться на Number.toFixed

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

Я собираюсь использовать что-то вроде

Math.round(N*1000000)/1000000

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

Ответы [ 5 ]

15 голосов
/ 03 декабря 2008

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

if (!Number.prototype.toFixed)

    Number.prototype.toFixed = function(precision) {
        var power = Math.pow(10, precision || 0);
        return String(Math.round(this * power)/power);
    }
0 голосов
/ 04 сентября 2009

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

 Number.prototype.toFixed = function(precision) {
     var power = Math.pow(10, precision || 0);
     return String(Math.round(this * power)/power);
 }
0 голосов
/ 28 декабря 2008

Другой вариант - (который не преобразует в строку без необходимости, а также исправляет просчет (162.295) .toFixed (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<br /> step 5 to the corrected 162.30. Without it we would get 162.3 */

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

0 голосов
/ 03 декабря 2008

С сайта байтов , эта функция почти такая же, как у Сержа Ильинского:

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 голосов
/ 03 декабря 2008

Я думаю, что 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 часто переходят на последнюю версию.

...