Calculating between inputs and playing in a variable

Asked

Viewed 156 times

-1

I have this problem, because it is not returning anything and trying to find everywhere, but nothing solution so far I will post the codes of my tests.

Follows:

function calculo(){
   
if (formulario.nome_para.value=="") {
alert("Preencha seu nome corretamente.");
formulario.nome_para.focus();
return false }
 
if (formulario.seu_email.value=="") {
alert("Preencha seu e-mail corretamente.");
formulario.seu_email.focus();
return false }
 
if (formulario.telefone.value=="") {
alert("Preencha seu telefone corretamente.");
formulario.telefone.focus();
return false }
 
if (formulario.endereco.value=="") {
alert("Preencha seu endereço corretamente.");
formulario.endereco.focus();
return false }
 
if (formulario.cidade.value=="") {
alert("Preencha sua cidade corretamente.");
formulario.cidade.focus();
return false }
 
if (formulario.comoConhece.value=="") {
alert("Preencha o campo como conheceu a gente.");
formulario.comoConhece.focus();
return false }
 
var buscaOptionOb = document.getElementById("TipoObra");
var TipoObra = buscaOptionOb.options[buscaOptionOb.selectedIndex].value;
var metro2 = formulario.m2.value;
var limMetro2 = str.match([0-9]/",");
var idadeEd = formulario.idadeEdifica.value;
var limIdadeEd = str.match([0-9]/",");
var tipoObra = formulario.TipoObra.value;
 
var calValRef = tipoObra*limMetro2;
if(limIdadeEd>10){
    calIdade=calValRef*1.2;
}else{
    calIdade=0;
}
if (formulario.reforcoEstru[0].checked) {
    calReforco=calValRef*75.00
}else{
    calReforco=0;
}
var calTot=calIdade+calReforco+calValRef;
document.getElementById('calTotal').value = calTot;    
}
<form onsubmit="return calculo(this);" id="formulario" action="calculoMinuto1.php" method="post"> 
          <div class="col1E">
          <select id="TipoObra"  name="valores">
            <option value="Tipo de obra">Tipo de obra</option>
            <option value="Reforma residencial - Casa">Reforma residencial - Casa</option>
            <option value="Reforma residencial - Apartamento">Reforma residencial - Apartamento</option>
            <option value="Reforma Comercial - Apartamento">Reforma Comercial - Apartamento</option>
            <option value="Reforma Comercial - Casa">Reforma Comercial - Casa</option>
            <option value="Execução de uma nova residência">Execução de uma nova residência</option>
            <option value="Execução de um novo Galpão">Execução de um novo Galpão</option>
            <option value="Execução de um novo estabelecimento comercial">Execução de um novo estabelecimento comercial</option>
          </select>
          <br />
          <input type="text" name="idadeEdifica" id="idadeEdifica" placeholder="Idade edificação" onKeyUp="mascaraAno(this, event)"  value="">
          <br />
          <input type="text" name="m2" id="m2" placeholder="m²"  onKeyUp="maskIt(this,event,'###.###.###,## m2',true)"  value="">
          <br />
          <select id="reforcoEstru"  name="reforcoEstru">
            <option value="">Reforço estrutural</option>
            <option value="Sim">Sim</option>
            <option value="Não">Não</option>
          </select>
          <br />
          <input name="comoConhece" id="comoConhece" type="text" class="campo-simples" placeholder="Como nos conheceu?" />
          </div>
          <div class="col2D">
          <input name="nome_para" id="nome_para" type="text" class="campo-simples" placeholder="Seu nome" />
          <br />
          <input name="seu_email" id="seu_email" type="text" class="campo-simples" placeholder="E-mail" />
          <br />
          <input name="telefone" id="telefone" type="text" class="campo-simples" id="telefone" placeholder="Telefone" maxlength="15" minlength="10"/>
          <br />
          <input name="endereco" id="endereco" type="text" class="campo-simples" placeholder="Endereço da obra" />
          <br />
          <input name="cidade" id="cidade" type="text" class="campo-simples" placeholder="Cidade" />
          </div>
          <div class="col3T">
          <textarea name="mensagem" rows="3" cols="40" rows="10" class="campo-mensagem" placeholder="Mensagem"></textarea>
          <br />
          <strong>Adicionar arquivo</strong><br />
          <input name="arquivo" type="file" class="campo-simples" />
          <br />
          <input name="Submit" type="submit" class="campo-envia" value="Enviar" />
          </div>
          <input name="assunto" type="hidden" class="campo-cinza" value="Formulario de Orcamento Minuto" />
          <input name="email" type="hidden" class="campo-cinza"value="[email protected]" />
          <input name="calTotal" id="calTotal" type="hidden" class="campo-cinza" value="" />
          <input type="hidden" name="encoding" value="UTF-8">
    </form>

JS Code: https://pastebin.com/CqpqL19N Html code: https://pastebin.com/HYegGpMG

  • Try to specify your problem by creating one Minimum Verifiable Example and putting in question the code relevant to the problem

  • I didn’t understand anything about your code or your problem, I just copied what you had into Pastebin here. I don’t understand your question or what you’re trying to do. But, it wouldn’t be the case to have a return true; at the end of its function calculo()?

  • This is a calculation system that after the check I pick up and send to another page and on this other page has a system for sending email. I put together the code logic of how it should work, but it doesn’t work

  • I’ll explain in parts, so that you understand better and can help me.

  • 1

    var limMetro2 = str.match([0-9]/","); where does this str? This regex is badly formatted need to / at the beginning and end.

  • Isn’t one missing var formulario = document.getElementById("formulario"); at the beginning of the function calculo()?

  • The field Tipoobra it has some values pre defined that will be multiplied by the m2, thus generating a total, however it has some ifs, if ageThis is greater than 10 is added one more value and if the reinforced field is ticado It is like yes added another value, is all this is added in a total variable

  • m2 and ageTime has masks

  • I’m very lay in JS I’m still studying, this code copied in parts and tried to mount using logic, str < I don’t know what it means, now that spoke I’m playing on google for a search, let so var limMetro2 = match(/[0-9]/","/);

  • If I choose the option Reforma Comercial - Casa, it will take that text and multiply it by the square meter. It makes no sense to multiply a text by an area. How the type of work should be used in the calculation?

  • I tried to assign values to the case case, but without success, I have to declare differently? remembering that my value can not pass numbers, because when arrive to send to the email would only arrive numbers and not text.

  • Yes it would not even make sense to multiply text, but I have to pass as value because of the time to send the email, I’m trying to attach value by the cases

Show 7 more comments

2 answers

0

<script>
function validaErroBranco(campo, mensagem) {
    if (campo.value !== "") return true;
    alert(mensagem);
    campo.focus();
    return false;
}
function valorDeRefPorTipoDeObra(TipoObra) {
    switch (TipoObra) {
         case 'Reforma residencial - Casa':  return 811.56;
         case 'Reforma residencial - Apartamento': return 932.12;
         case 'Reforma Comercial - Apartamento':  return 612.79;
         case 'Reforma Comercial - Casa': return 780.00;
         case 'Execução de uma nova residência': return 2700.00;
         case 'Execução de um novo Galpão': return 1400.00;
         case 'Execução de um novo estabelecimento comercial': return 2350.00;
    }
}
function calculo() {
    var formulario = document.getElementById("formulario");

    var valido = validaErroBranco(formulario.nome_para, "Preencha seu nome corretamente.")
        && validaErroBranco(formulario.seu_email, "Preencha seu e-mail corretamente.")
        && validaErroBranco(formulario.telefone, "Preencha seu telefone corretamente.")
        && validaErroBranco(formulario.endereco, "Preencha seu endereço corretamente.")
        && validaErroBranco(formulario.cidade, "Preencha sua cidade corretamente.")
        && validaErroBranco(formulario.comoConhece, "Preencha o campo como conheceu a gente.");
    if (!valido) return false;
    var tipoOption = document.getElementById("TipoObra");
    if (tipoOption.selectedIndex === 0) {
        alert("Escolha o tipo da obra.");
        tipoOption.focus();
        return false;
    }
    var reforcoOption = document.getElementById("reforcoEstrutural");
    if (reforcoOption.selectedIndex === 0) {
        alert("Escolha o tipo do reforço.");
        reforcoOption.focus();
        return false;
    }
    var metro2 = parseInt(formulario.m2.value);
    if (isNaN(metro2)) {
         alert("O campo de m² deve ser preenchido com números.");
         formulario.m2.focus();
         return false;
    }
    var idadeEd = parseInt(formulario.idadeEdifica.value);
    if (isNaN(idadeEd)) {
         alert("Os campo de idade edificação deve ser preenchido com números.");
         formulario.idadeEdifica.focus();
         return false;
    }
    var tipoObra = valorDeRefPorTipoDeObra(tipoOption[tipoOption.selectedIndex].value);
    var calValorRef = tipoObra * metro2;
    var calIdade = (idadeEd > 10) ? tipoObra * 1.2 : 0;
    var calReforco = (reforcoOption.selectedIndex === 1) ? metro2 * 75.00 : 0;
    var calTotal = (idadeEd > 10) ? calIdade * metro2 + calReforco : calIdade + calReforco + calValorRef;
    var trasfN = parseFloat(Math.round(calTotal * 100) / 100).toFixed(2);
    document.getElementById('calTotal').value = trasfN;
    <?php /*?>alert(calTotal);<?php */?>
    return true;
}
</script>

It was this way in case someone needs it! Thank you very much Victor Stafusa.

0

First, we use parseInt for try to get a number from a text value. However, if the user type abc in the numerical field, the parseInt will fail and return NaN. That’s where the function comes in isNaN which serves to determine if the entered value is even a number.

Another thing is that I put a function to validate if a field is empty, to avoid copying and pasting code.

I created a function valorDeRefPorTipoDeObra which tells the reference value of the square metre according to the type of work. This function is probably wrong, but it should be easy for you to adjust the appropriate values on it.

I do not know if the calculation produces the correct numbers (even if the function valorDeRefPorTipoDeObra is correct), but it validates the fields and shows the calculated result of the total of lime. It also returns true when it is valid and false when it is not. I assumed that the formulas you gave were correct.

The code was this below. Downstairs has a blue button Execute you can use to test this code.

Stayed like this:

// Desativadas apenas para poder simular abaixo.
function maskIt() {}
function mascaraAno() {}

function validaErroBranco(campo, mensagem) {
    if (campo.value !== "") return true;
    alert(mensagem);
    campo.focus();
    return false;
}

function valorDeRefPorTipoDeObra(tipo) {
    switch (tipo) {
         case 'Reforma residencial - Casa': return 1;
         case 'Reforma residencial - Apartamento': return 2;
         case 'Reforma Comercial - Apartamento': return 3;
         case 'Reforma Comercial - Casa': return 4;
         case 'Execução de uma nova residência': return 5;
         case 'Execução de um novo Galpão': return 6;
         case 'Execução de um novo estabelecimento comercial': return 7;
    }
}

function calculo() {
    var formulario = document.getElementById("formulario");

    var valido = validaErroBranco(formulario.nome_para, "Preencha seu nome corretamente.")
        && validaErroBranco(formulario.seu_email, "Preencha seu e-mail corretamente.")
        && validaErroBranco(formulario.telefone, "Preencha seu telefone corretamente.")
        && validaErroBranco(formulario.endereco, "Preencha seu endereço corretamente.")
        && validaErroBranco(formulario.cidade, "Preencha sua cidade corretamente.")
        && validaErroBranco(formulario.comoConhece, "Preencha o campo como conheceu a gente.");

    if (!valido) return false;

    var tipoOption = document.getElementById("TipoObra");
    if (tipoOption.selectedIndex === 0) {
        alert("Escolha o tipo da obra.");
        tipoOption.focus();
        return false;
    }

    var reforcoOption = document.getElementById("reforcoEstrutural");
    if (reforcoOption.selectedIndex === 0) {
        alert("Escolha o tipo do reforço.");
        reforcoOption.focus();
        return false;
    }

    var metro2 = parseInt(formulario.m2.value);
    if (isNaN(metro2)) {
         alert("O campo de m² deve ser preenchido com números.");
         formulario.m2.focus();
         return false;
    }

    var idadeEd = parseInt(formulario.idadeEdifica.value);
    if (isNaN(idadeEd)) {
         alert("Os campo de idade edificação deve ser preenchido com números.");
         formulario.idadeEdifica.focus();
         return false;
    }

    var tipoObra = valorDeRefPorTipoDeObra(tipoOption[tipoOption.selectedIndex].value);
 
    var calValorRef = tipoObra * metro2;
    var calIdade = idadeEd > 10 ? calValorRef * 1.2 : 0;
    var calReforco = reforcoOption.selectedIndex === 1 ? calValorRef * 75.00 : 0;
    var calTotal = calIdade + calReforco + calValorRef;
    document.getElementById('calTotal').value = calTotal;
    alert(calTotal);
    return true;
}
<form onsubmit="return calculo();" id="formulario" action="calculoMinuto1.php" method="post"> 
      <div class="col1E">
          <select id="TipoObra" name="valores">
              <option value="Tipo de obra">Tipo de obra</option>
              <option value="Reforma residencial - Casa">Reforma residencial - Casa</option>
              <option value="Reforma residencial - Apartamento">Reforma residencial - Apartamento</option>
              <option value="Reforma Comercial - Apartamento">Reforma Comercial - Apartamento</option>
              <option value="Reforma Comercial - Casa">Reforma Comercial - Casa</option>
              <option value="Execução de uma nova residência">Execução de uma nova residência</option>
              <option value="Execução de um novo Galpão">Execução de um novo Galpão</option>
              <option value="Execução de um novo estabelecimento comercial">Execução de um novo estabelecimento comercial</option>
          </select>
          <br />
          <input type="text" name="idadeEdifica" id="idadeEdifica" placeholder="Idade edificação" onKeyUp="mascaraAno(this, event)" value="">
          <br />
          <input type="text" name="m2" id="m2" placeholder="m²" onKeyUp="maskIt(this, event, '###.###.###,## m2', true)" value="">
          <br />
          <select id="reforcoEstrutural" name="reforcoEstrutural">
              <option value="">Reforço estrutural</option>
              <option value="Sim">Sim</option>
              <option value="Não">Não</option>
          </select>
          <br />
          <input name="comoConhece" id="comoConhece" type="text" class="campo-simples" placeholder="Como nos conheceu?" />
          </div>
          <div class="col2D">
          <input name="nome_para" id="nome_para" type="text" class="campo-simples" placeholder="Seu nome" />
          <br />
          <input name="seu_email" id="seu_email" type="text" class="campo-simples" placeholder="E-mail" />
          <br />
          <input name="telefone" id="telefone" type="text" class="campo-simples" id="telefone" placeholder="Telefone" maxlength="15" minlength="10"/>
          <br />
          <input name="endereco" id="endereco" type="text" class="campo-simples" placeholder="Endereço da obra" />
          <br />
          <input name="cidade" id="cidade" type="text" class="campo-simples" placeholder="Cidade" />
          </div>
          <div class="col3T">
          <textarea name="mensagem" rows="3" cols="40" rows="10" class="campo-mensagem" placeholder="Mensagem"></textarea>
          <br />
          <strong>Adicionar arquivo</strong><br />
          <input name="arquivo" type="file" class="campo-simples" />
          <br />
          <input name="Submit" type="submit" class="campo-envia" value="Enviar" />
          </div>
          <input name="assunto" type="hidden" class="campo-cinza" value="Formulario de Orcamento Minuto" />
          <input name="email" type="hidden" class="campo-cinza"value="[email protected]" />
          <input name="calTotal" id="calTotal" type="hidden" class="campo-cinza" value="" />
          <input type="hidden" name="encoding" value="UTF-8">
    </form>

  • case 'Home makeover - Home': Return 1; typeOption=811.56; break;

  • I’m trying to assign value to home case this way but without much success

  • @Fernando case 'Reforma residencial - Casa': return 811.56;

  • I managed to do the calculation thank you very much, I only have another doubt if you can help me, the number is returning whole without any score, you recommend me to use mask ?

  • @Fernando If you’re talking about the number of switch and by "wearing a mask," you say put a .00 At the end of the integer, that is indifferent, because for Javascript the two are synonymous. However, if you are talking about mask in the m2 field, this might be a good idea if done correctly.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.