• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

powerPT

Soma e resultado é NaN

9 mensagens neste tópico

Já pesquisei sobre o assunto mas não encontrei nenhuma solução válida.

Tenho um formulário em que tem x campos e mediante um evento qualquer (não importa) faz a soma dos tais campos.

O problema é que usando esta função:

function soma_total()
{
	resultado = parseInt(document.getElementById("valor_senior").value) + parseInt(document.getElementById("valor_senior2125").value) + parseInt(document.getElementById("valor_veterano").value) + parseInt(document.getElementById("valor_superveterano").value) + parseInt(document.getElementById("valor_senhora").value) + parseInt(document.getElementById("valor_junior").value) + parseInt(document.getElementById("valor_h_apa").value) + parseInt(document.getElementById("valor_h_suplm").value) + parseInt(document.getElementById("valor_ap_apa").value) + parseInt(document.getElementById("valor_ap_suplm").value);

	document.getElementById("valor_total").value = resultado;
}

O resultado escrito no textfield "valor_total" é NaN.

Alguém pode-me ajudar? Ainda por cima tenho somais parciais e tudo funciona.

Até posso mostrar a tal outra função:

function soma_parcial(pessoas,custo,campo)
{
	resultado = parseInt(document.getElementById(pessoas).value) * parseInt(custo);
	document.getElementById(campo).value = resultado;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cá está:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Inscrição Mundial</title>
<style>
h1 {
font-size: 18px;
}
h2 {
font-size: 15px;
}
h6 {
font-size: 11px;
font-weight:normal;
margin: 0;
}
body, td, th {
font-family: Verdana, Geneva, sans-serif;
font-size: 12px;
}
</style>
<script type="text/javascript">
function soma_parcial(pessoas,custo,campo)
{
	resultado = parseInt(document.getElementById(pessoas).value) * parseInt(custo);
	document.getElementById(campo).value = resultado;
	soma_total();
}

function soma_total()
{
	resultado = parseInt(document.getElementById("valor_senior").value) + parseInt(document.getElementById("valor_senior2125").value) + parseInt(document.getElementById("valor_veterano").value) + parseInt(document.getElementById("valor_superveterano").value) + parseInt(document.getElementById("valor_senhora").value) + parseInt(document.getElementById("valor_junior").value) + parseInt(document.getElementById("valor_h_apa").value) + parseInt(document.getElementById("valor_h_suplm").value) + parseInt(document.getElementById("valor_ap_apa").value) + parseInt(document.getElementById("valor_ap_suplm").value);

	document.getElementById("valor_total").value = resultado;
}

function validar(campo)
{
	var valor = document.getElementById(campo).value;
	if (valor == "")
	{
		document.getElementById(campo).bgColor = "red";
	}
}
</script>
</head>
</head>
<body>
<form method="post" name="inscr">
  <table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tr>
      <td colspan="8"><h1>PREÇOS </h1></td>
    </tr>
    <tr bgcolor="#d4d2fa">
      <td width="510" bgcolor="#d4d2fa"><h2> </h2></td>
      <td width="44" align="right" bgcolor="#d4d2fa"> </td>
      <td width="13" align="center" bgcolor="#d4d2fa"> </td>
      <td width="54" align="center" bgcolor="#d4d2fa"><h4>Nº de Pessoas</h4></td>
      <td width="16" align="center" bgcolor="#d4d2fa"><h4> </h4></td>
      <td width="46" align="right" bgcolor="#d4d2fa"><h4>Total Parcial</h4></td>
      <td width="20" bgcolor="#d4d2fa"> </td>
      <td width="407"> </td>
    </tr>
    <tr bgcolor="#e1e0f1">
      <td bgcolor="#e1e0f1">Sénior</td>
      <td align="right" bgcolor="#e1e0f1">545€</td>
      <td width="13" align="center" bgcolor="#e1e0f1">x</td>
      <td align="center" bgcolor="#e1e0f1"><label>
          <input name="senior_pessoas" type="text" id="senior_pessoas" onchange="javascript:soma_parcial('senior_pessoas','545','valor_senior');" value="0" size="3" />
        </label></td>
      <td align="center" bgcolor="#e1e0f1">=</td>
      <td align="right" bgcolor="#e1e0f1"><input name="valor_senior" type="text" id="valor_senior" size="7" readonly="readonly" /></td>
      <td bgcolor="#e1e0f1">€</td>
      <td bgcolor="#e1e0f1"> </td>
    </tr>
    <tr bgcolor="#ebeafc">
      <td bgcolor="#ebeafc">Sénior (21-25)*</td>
      <td align="right" bgcolor="#ebeafc">295€</td>
      <td width="13" align="center" bgcolor="#ebeafc">x</td>
      <td align="center" bgcolor="#ebeafc"><input name="senior2125_pessoas" type="text" id="senior2125_pessoas" onchange="javascript:soma_parcial('senior2125_pessoas','295','valor_senior2125');" value="0" size="3" /></td>
      <td align="center" bgcolor="#ebeafc">=</td>
      <td align="right" bgcolor="#ebeafc"><input name="valor_senior2125" type="text" id="valor_senior2125" size="7" readonly="readonly" /></td>
      <td bgcolor="#ebeafc">€</td>
      <td> </td>
    </tr>
    <tr bgcolor="#e1e0f1">
      <td>Veterano</td>
      <td align="right">425€</td>
      <td width="13" align="center">x</td>
      <td align="center"><input name="veterano_pessoas" type="text" id="veterano_pessoas" onchange="javascript:soma_parcial('veterano_pessoas','425','valor_veterano');" value="0" size="3" /></td>
      <td align="center">=</td>
      <td align="right"><input name="valor_veterano" type="text" id="valor_veterano" size="7" readonly="readonly" /></td>
      <td>€</td>
      <td> </td>
    </tr>
    <tr bgcolor="#ebeafc">
      <td>Super Veterano</td>
      <td align="right">255€</td>
      <td width="13" align="center">x</td>
      <td align="center"><input name="superveterano_pessoas" type="text" id="superveterano_pessoas" onchange="javascript:soma_parcial('superveterano_pessoas','255','valor_superveterano');" value="0" size="3" /></td>
      <td align="center">=</td>
      <td align="right"><input name="valor_superveterano" type="text" id="valor_superveterano" size="7" readonly="readonly" /></td>
      <td>€</td>
      <td> </td>
    </tr>
    <tr bgcolor="#e1e0f1">
      <td bgcolor="#e1e0f1">Senhora</td>
      <td align="right">175€</td>
      <td width="13" align="center">x</td>
      <td align="center"><input name="senhora_pessoas" type="text" id="senhora_pessoas" onchange="javascript:soma_parcial('senhora_pessoas','175','valor_senhora');" value="0" size="3" /></td>
      <td align="center">=</td>
      <td align="right"><input name="valor_senhora" type="text" id="valor_senhora" size="7" readonly="readonly" /></td>
      <td>€</td>
      <td> </td>
    </tr>
    <tr bgcolor="#ebeafc">
      <td>Júnior*</td>
      <td align="right">45€</td>
      <td width="13" align="center">x</td>
      <td align="center"><input name="junior_pessoas" type="text" id="junior_pessoas" onchange="javascript:soma_parcial('junior_pessoas','45','valor_junior');" value="0" size="3" /></td>
      <td align="center">=</td>
      <td align="right"><input name="valor_junior" type="text" id="valor_junior" size="7" readonly="readonly" /></td>
      <td>€</td>
      <td> </td>
    </tr>
    <tr>
      <td colspan="8" valign="top" bgcolor="#e1e0f1"><h6>* valor a completar em caso de prémio | Estão excluídas as provas extras</h6></td>
    </tr>
    <tr>
      <td colspan="8" bgcolor="#d4d2fa"><h2> </h2></td>
    </tr>
    <tr bgcolor="#e1e0f1">
      <td bgcolor="#e1e0f1">HOTEL SOLVERDE *****<br /></td>
      <td align="right"> </td>
      <td width="13" align="center"> </td>
      <td align="center"> </td>
      <td align="center"> </td>
      <td align="right"> </td>
      <td> </td>
      <td> </td>
    </tr>
    <tr>
      <td bgcolor="#ebeafc">em regime APA</td>
      <td align="right" bgcolor="#ebeafc">726€</td>
      <td width="13" align="center" bgcolor="#ebeafc">x</td>
      <td align="center" bgcolor="#ebeafc"><input name="hsol_apa_pessoas" type="text" id="hsol_apa_pessoas" onchange="javascript:soma_parcial('hsol_apa_pessoas','726','valor_h_apa');" value="0" size="3" /></td>
      <td align="center" bgcolor="#ebeafc"> </td>
      <td align="right" bgcolor="#ebeafc"><input name="valor_h_apa" type="text" id="valor_h_apa" size="7" readonly="readonly" /></td>
      <td bgcolor="#ebeafc">€</td>
      <td bgcolor="#ebeafc"> </td>
    </tr>
    <tr>
      <td bgcolor="#ebeafc">sumplemento quarto individual</td>
      <td align="right" bgcolor="#ebeafc">335€</td>
      <td width="13" align="center" bgcolor="#ebeafc">x</td>
      <td align="center" bgcolor="#ebeafc"><input name="hsol_suplm_pessoas" type="text" id="hsol_suplm_pessoas" onchange="javascript:soma_parcial('hsol_suplm_pessoas','335','valor_h_suplm');" value="0" size="3" /></td>
      <td align="center" bgcolor="#ebeafc"> </td>
      <td align="right" bgcolor="#ebeafc"><input name="valor_h_suplm" type="text" id="valor_h_suplm" size="7" readonly="readonly" /></td>
      <td bgcolor="#ebeafc">€</td>
      <td bgcolor="#ebeafc"> </td>
    </tr>
    <tr>
      <td bgcolor="#e1e0f1">HOTEL APARTAMENTO SOLVERDE ***</td>
      <td align="right" bgcolor="#e1e0f1"> </td>
      <td width="13" align="center" bgcolor="#e1e0f1"> </td>
      <td align="center" bgcolor="#e1e0f1"> </td>
      <td align="center" bgcolor="#e1e0f1"> </td>
      <td align="right" bgcolor="#e1e0f1"> </td>
      <td bgcolor="#e1e0f1"> </td>
      <td bgcolor="#e1e0f1"> </td>
    </tr>
    <tr>
      <td bgcolor="#ebeafc">em regime APA</td>
      <td align="right" bgcolor="#ebeafc">478€</td>
      <td width="13" align="center" bgcolor="#ebeafc">x</td>
      <td align="center" bgcolor="#ebeafc"><input name="apart_apa_pessoas" type="text" id="apart_apa_pessoas" onchange="javascript:soma_parcial('apart_apa_pessoas','478','valor_ap_apa');" value="0" size="3" /></td>
      <td align="center" bgcolor="#ebeafc"> </td>
      <td align="right" bgcolor="#ebeafc"><input name="valor_ap_apa" type="text" id="valor_ap_apa" size="7" readonly="readonly" /></td>
      <td bgcolor="#ebeafc">€</td>
      <td bgcolor="#ebeafc"> </td>
    </tr>
    <tr>
      <td bgcolor="#ebeafc">suplemento quarto individual</td>
      <td align="right" bgcolor="#ebeafc">198€</td>
      <td width="13" align="center" bgcolor="#ebeafc">x</td>
      <td align="center" bgcolor="#ebeafc"><input name="apart_suplm_pessoas" type="text" id="apart_suplm_pessoas" onchange="javascript:soma_parcial('apart_suplm_pessoas','198','valor_ap_suplm');" value="0" size="3" /></td>
      <td align="center" bgcolor="#ebeafc"> </td>
      <td align="right" bgcolor="#ebeafc"><input name="valor_ap_suplm" type="text" id="valor_ap_suplm" size="7" readonly="readonly" /></td>
      <td bgcolor="#ebeafc">€</td>
      <td bgcolor="#ebeafc"> </td>
    </tr>
    <tr>
      <td colspan="8" bgcolor="#d4d2fa"><h2>Jantar de Gala</h2></td>
    </tr>
    <tr>
      <td bgcolor="#ebeafc">(veterano / super veterano / senhora / sénior 21-25 / júnior / acompanhante ou sénior não inscrito no abono do Campeonato do Mundo)</td>
      <td align="right" bgcolor="#ebeafc">50€</td>
      <td width="13" align="center" bgcolor="#ebeafc">x</td>
      <td align="center" bgcolor="#ebeafc"><input name="jantar_pessoas" type="text" id="jantar_pessoas" onchange="javascript:soma_parcial('jantar_pessoas','50','valor_jantar');" value="0" size="3" /></td>
      <td align="center" bgcolor="#ebeafc"> </td>
      <td align="right" bgcolor="#ebeafc"><input name="valor_jantar" type="text" id="valor_jantar" size="7" readonly="readonly" /></td>
      <td bgcolor="#ebeafc">€</td>
      <td bgcolor="#ebeafc"> </td>
    </tr>
    <tr bgcolor="#e1e0f1">
      <td> </td>
      <td align="right"> </td>
      <td align="center"> </td>
      <td> </td>
      <td align="center"> </td>
      <td align="right"> </td>
      <td> </td>
      <td> </td>
    </tr>
    <tr bgcolor="#ebeafc">
      <td colspan="4" align="right"><strong>Total Final:</strong></td>
      <td align="center"> </td>
      <td align="right"><label>
          <input name="valor_total" type="text" id="valor_total" size="7" readonly="readonly" />
        </label></td>
      <td>€</td>
      <td> </td>
    </tr>
  </table>
  <table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tr>
      <td colspan="3" bgcolor="#d4d2fa"><h2>FORMULÁRIO DE INSCRIÇÃO</h2></td>
    </tr>
    <tr>
      <td colspan="3" bgcolor="#e1e0f1"><p> </p></td>
    </tr>
    <tr bgcolor="#ebeafc">
      <td colspan="3"><h4>Complete os seus dados</h4></td>
    </tr>
    <tr bgcolor="#e1e0f1">
      <td width="20%">Nome Completo</td>
      <td width="35%"><label>
          <input name="nome" type="text" id="nome" size="60" />
        </label></td>
      <td width="45%"> </td>
    </tr>
    <tr bgcolor="#ebeafc">
      <td valign="top">Morada</td>
      <td><label>
          <textarea name="morada" id="morada" cols="45" rows="5"></textarea>
        </label></td>
      <td> </td>
    </tr>
    <tr bgcolor="#e1e0f1">
      <td bgcolor="#e1e0f1">Contacto</td>
      <td><label>
          <input name="contacto" type="text" id="contacto" size="15" />
        </label></td>
      <td> </td>
    </tr>
    <tr bgcolor="#ebeafc">
      <td>E-mail</td>
      <td><label>
          <input name="email" type="text" id="email" size="30" />
        </label></td>
      <td> </td>
    </tr>
    <tr bgcolor="#e1e0f1">
      <td colspan="3"><h4>Outros participantes no mesmo alojamento</h4></td>
    </tr>
    <tr bgcolor="#ebeafc">
      <td valign="top">Nomes Completos (em cada linha)</td>
      <td><label>
          <textarea name="nomes_outros" id="nomes_outros" cols="45" rows="5"></textarea>
        </label></td>
      <td> </td>
    </tr>
    <tr>
      <td colspan="3"><div id='myform_errorloc' class='error_strings'></div>
        <label>
          <input type="submit" name="submeter" id="submeter" value="Enviar Inscrição" style="background-color:#36F; color:#FFF; width: 200px; height: 50px; font-weight:bold;" />
        </label></td>
    </tr>
  </table>
</form>
</body>
</html>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não estou a ver nada mal, talvez seja apenas uma mariquice qualquer do motor de JavaScript com data types. Experimenta assim:

   function soma_parcial(pessoas,custo,campo)
  {
      resultado = parseInt(document.getElementById(pessoas).value) * parseInt(custo);
      document.getElementById(campo).value = (string)resultado;
      soma_total();
  }

  function soma_total()
  {
      resultado = parseInt(document.getElementById("valor_senior").value)
      + parseInt(document.getElementById("valor_senior2125").value)
      + parseInt(document.getElementById("valor_veterano").value)
      + parseInt(document.getElementById("valor_superveterano").value)
      + parseInt(document.getElementById("valor_senhora").value)
      + parseInt(document.getElementById("valor_junior").value)
      + parseInt(document.getElementById("valor_h_apa").value)
      + parseInt(document.getElementById("valor_h_suplm").value)
      + parseInt(document.getElementById("valor_ap_apa").value)
      + parseInt(document.getElementById("valor_ap_suplm").value);
      
      document.getElementById("valor_total").value = (string)resultado;
  }

Se não der, vai fazendo alert()s com o resultado do typeof() e valor das variáveis até encontrares o culpado.

Btw, tens um </head> a mais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois nem eu vejo nada de mal e estou-me a passar com isto  :wallbash:

Fazer isso da conversão para string já eu tinha feito mas usando o .toString() e sem resultado positivo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O .value é o que ele quer porque está a utilizar inputs, o innerHTML era se estivesse a trabalhar com (p.e.) div's, td's, etc.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já vi qual é o erro. Quando o .value é "", o parseInt() retorna NaN, daí estar a dar buraco. Basta usares algo como isto em vez de parseInt que já deve funcionar:

function Integer(x){ if(x == "") return 0; else return parseInt(x); }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É isso mesmo! Já está resolvido, muito muito obrigado! Já estava a desistir da soma total, ai estava...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora