Pergunta

Eu preciso números decimais redondas com seis casas usando JavaScript, mas eu preciso considerar navegadores antigos que eu pode 't dependem de Number.toFixed

A captura grande com toExponential, toFixed e toPrecision é que eles são construções bastante modernos não suportados no Mozilla até que o Firefox versão 1.5 (embora IE apoiou os métodos desde a versão 5.5). Embora seja principalmente seguro de usar esses métodos, navegadores mais antigos vai quebrar isso, se você estiver escrevendo um programa público é recomendado que você forneça seus próprios protótipos para fornecer funcionalidade para esses métodos para navegador mais antigo.

Estou pensando em usar algo como

Math.round(N*1000000)/1000000

O que é o melhor método para fornecer este um protótipo para navegadores mais antigos?

Foi útil?

Solução

Tente isto:

if (!Number.prototype.toFixed)

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

Outras dicas

Eu acho Firefox 1.5 e IE 5 são praticamente deixou de ser utilizado, ou por uma quantidade muito menor de pessoas.
É um pouco como codificação para suportar Netscape Navigator ... :-)
A menos que algum outro principais navegadores (Opera? Safari? Improvável ...) não suporta este, ou se seus Web logs mostram monte de utilização do navegador legado, você provavelmente só pode usar esses métodos.
Em algum momento, nós temos que seguir em frente. ^ _ ^

[EDIT] funciona bem no Opera 9.50 e Safari 3.1

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

O artigo que você referência é de um ano e meio atrás, uma eternidade na indústria de TI ... Eu acho que, ao contrário de usuários do IE, Firefox usuários muitas vezes vão para a versão mais recente.

A partir Bytes website , esta função é quase o mesmo do que Serge llinsky de:

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);
  }
}

Outra opção é (que não converte para uma cadeia desnecessariamente, e também corrige o erro de cálculo de (162,295) .toFixed (2) para 162,29 (deve ser 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: Ao tentar esta encarnação específica, this*=Math.pow(10, precision||0) cria um inválido erro da mão esquerda atribuição. Então deu a esta palavra-chave do a variável. Também ajudaria se eu fechei funções ^ _ ^ ;;

Tente isto:

 Number.prototype.toFixed = function(precision) {
     var power = Math.pow(10, precision || 0);
     return String(Math.round(this * power)/power);
 }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top