Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Problema com o toFixed

Percebi que depois do código finalizado, que se eu escrevesse no formulário quantas casas depois da vírgula eu quisesse, ele passaria para a tabela daquele jeito, exemplo, eu escrevo no imput de altura: 1.8000, vai aparecer na tabela ta td altura: 1.8000, e eu queria que aparecesse apenas 1.80.

Porém depois de diversas tentativas esse foi meu erro mais lógico para mim:

ERRO:

form.js:52 Uncaught TypeError: paciente.pesoValue.toFixed is not a function at montaTr (form.js:52) at HTMLButtonElement. (form.js:11)

CÓDIGO:
var botaoAdicionar = document.querySelector("#adicionar-paciente");
botaoAdicionar.addEventListener("click",function(event){
    event.preventDefault();

    let form = document.querySelector("#form-adiciona");

    let paciente = obtemPaciente(form);

    let tabela = document.querySelector("#tabela-pacientes");

    let novaTr = montaTr(paciente);

    let erros = MensagemDeErros(paciente);
    console.log(erros);
    if(erros.length > 0){
        exibeMensagemDeErros(erros);
        return;
    }

    tabela.appendChild(novaTr);

    form.reset();

    let limpaUl = document.querySelector("#mensagens-erros")
    limpaUl.innerHTML = "";

});

function obtemPaciente(form){
    let dados = {
        nomeValue: form.nome.value,
        pesoValue: form.peso.value,
        alturaValue: form.altura.value,
        gorduraValue: form.gordura.value,
        imcValue: calculaImc(form.peso.value,form.altura.value)
    };
    return dados;
};

function montaTd(dado,classe){

    let tdPronta = document.createElement("td");
    tdPronta.textContent = dado;
    tdPronta.classList.add(classe);
    return tdPronta;
}

function montaTr(paciente){
    let trPronta = document.createElement("tr");
    trPronta.classList.add("paciente");
    trPronta.appendChild(montaTd(paciente.nomeValue,"info-nome"));
    trPronta.appendChild(montaTd(paciente.pesoValue.toFixed(2),"info-peso"));
    trPronta.appendChild(montaTd(paciente.alturaValue.toFixed(2),"info-altura"));
    trPronta.appendChild(montaTd(paciente.gorduraValue.toFixed(2),"info-gordura"));
    trPronta.appendChild(montaTd(paciente.imcValue,"info-imc"));;
    return trPronta;
};

function MensagemDeErros(paciente){

    let erros = [];

    if(!validaPeso(paciente.pesoValue)){ 
        erros.push("Peso Inválido");
    }
    if(!validaAltura(paciente.alturaValue)){ 
        erros.push("Altura Inválida");
    }
    if(paciente.gorduraValue.length == 0){
        erros.push("Gordura não pode ficar em branco (miguérsrs)");
    }
    if(paciente.nomeValue.length < 2){
        erros.push("O nome não pode conter menos de dois caracteres");
    }
    return erros;
}

function exibeMensagemDeErros(erros){
    let ul = document.querySelector("#mensagens-erros");
    ul.innerHTML = "";
    erros.forEach(function(erro){
        let li = document.createElement("li");
        li.textContent = erro;
        ul.appendChild(li);
    })
}

Alguém conseguiria me mandar um código funcional que resolvesse esse problema, e me dizer porque o meu código não deu certo. Ficaria muito grato.

3 respostas

Fala Daniel, tudo bem? Espero que sim!

Poderia enviar o projeto compactado por favor? através de algum link, assim consigo me contextualizar melhor no problema e resolver da melhor forma possível!

Aguardo o retorno :D

Aqui está o link com o projeto por inteiro: []https://drive.google.com/drive/folders/1x6quKuQYsfirA6anwQq89ZXeNnJy82jB?usp=sharing()

solução!

Olá, Daniel, tudo bem?

O problema que está causando o erro está dentro da função montaTr:

function montaTr(paciente){
    let trPronta = document.createElement("tr");
    trPronta.classList.add("paciente");
    trPronta.appendChild(montaTd(paciente.nomeValue,"info-nome"));
    trPronta.appendChild(montaTd(paciente.pesoValue.toFixed(2),"info-peso"));
    trPronta.appendChild(montaTd(paciente.alturaValue.toFixed(2),"info-altura"));
    trPronta.appendChild(montaTd(paciente.gorduraValue.toFixed(2),"info-gordura"));
    trPronta.appendChild(montaTd(paciente.imcValue,"info-imc"));;
    return trPronta;
};

Você está tentando usar a função toFixed() em: paciente.pesoValue, paciente.alturaValue e paciente.gorduraValue, mas todos esses valores são strings, e você só pode usar a função toFixed() em números.

Então antes de usar toFixed(), você deve antes fazer uma conversão desses dados para números, com a função Number() ou a parseFloat(), assim:

function montaTr(paciente){
    let trPronta = document.createElement("tr");
    trPronta.classList.add("paciente");
    trPronta.appendChild(montaTd(paciente.nomeValue,"info-nome"));
    trPronta.appendChild(montaTd(Number(paciente.pesoValue).toFixed(2),"info-peso"));
    trPronta.appendChild(montaTd(Number(paciente.alturaValue).toFixed(2),"info-altura"));
    trPronta.appendChild(montaTd(Number(paciente.gorduraValue).toFixed(2),"info-gordura"));
    trPronta.appendChild(montaTd(paciente.imcValue,"info-imc"));;
    return trPronta;
};

Se preferir, para deixar o código mais organizado, você também pode fazer essa conversão e usar o toFixed() dentro da função obtemPaciente(), e retornar os dados do paciente já formatados. Assim, na função montaTr você já receberá os dados prontos para de fato montar a tr.

Espero ter ajudado! Abraços e bons estudos :)