1
resposta

imc.toFixed(2) is not a function

imc.toFixed(2) is not a function

meu navegador mostra isso e não roda a aplicação. se eu coloco sem o toFixed ele funciona, mas com as casas a mais.

var pacientes = document.querySelectorAll(".paciente");

for (var i = 0; i < pacientes.length; i++) {

    var paciente = pacientes[i];

    var tdPeso = paciente.querySelector(".info-peso");
    var peso = tdPeso.textContent;

    var tdAltura = paciente.querySelector(".info-altura");
    var altura = tdAltura.textContent;

    var tdImc = paciente.querySelector(".info-imc");

    var pesoEhValido = true;
    var alturaEhValida = true;

    if (peso <= 0 || peso >= 1000) {
        console.log("Peso inválido!");
        pesoEhValido = false;
        tdImc.textContent = "Peso inválido";
        paciente.classList.add("paciente-invalido");
    }

    if (altura <= 0 || altura >= 3.00) {
        console.log("Altura inválida!");
        alturaEhValida = false;
        tdImc.textContent = "Altura inválida";
        paciente.classList.add("paciente-invalido");
    }

    if (alturaEhValida && pesoEhValido) {
        var imc = calculaImc(peso, altura);
        tdImc.textContent = imc.toFixed(2);
    }
}

function calculaImc(peso, altura) {
    var imc = 0;

    imc = peso / (altura * altura);

    return imc.toFixed(2);
}
1 resposta

Welinton,

O problema é que o uso duplicado do .toFixed(2) : 1. Dentro da função calculaImc, na linha

return imc.toFixed(2);
  1. No if depois da validação, na linha
    tdImc.textContent = imc.toFixed(2);

Remova o segundo .toFixed(2) e deve funcionar!

Aprofundando

O que acontece é que o .toFixed() é um método que só pode ser usado em números (number).

var altura = 1.70123;
altura.toFixed(2); // "1.70"

Não pode ser usada em textos (string).

var nome = "Fulano";
nome.toFixed(2); // ERRO! 
//Uncaught TypeError: 
//nome.toFixed is not a function

O pulo do gato é perceber o retorno lá do altura.toFixed(2). Percebe que a resposta está entre aspas: "1.70".

O retorno do .toFixed() é sempre uma string formatada como você quer. Aí, nenhuma string tem o método .toFixed(), só os number.

Como você encadeou 2 .toFixed() no seu código, da segunda vez você estava tentando chamar numa string!