Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Janiel Oliveira

[Resolvido] Problema com somar de valores Javascript

Recommended Posts

Pessoal, sou novato no forum mas tenho alguma experiência com programação php, mysql e javascript. recente estou trabalho em um sistema para minha empresa e me deparei com uma probleminha aqui com o seguinte codigo:

 

function somaParcela() {
		var valor = document.forms['newParcela'].valor.value;
		var desconto = document.forms['newParcela'].desconto.value;
		var multa = document.forms['newParcela'].multa.value;
		var juros = document.forms['newParcela'].juros.value;
		var soma = parseFloat(valor)-parseFloat(desconto)+parseFloat(multa)+parseFloat(juros);
		document.forms['newParcela'].total.value = eval(soma);
			  }
</script>
<form name="newParcela">
<input type="text" name="valor" value="" size="10" maxlength="11" onkeypress="return(formataMoeda(this,'.',',',event));" /><br>
<input type="text" name="desconto" value="" size="10" maxlength="11" onkeypress="return(formataMoeda(this,'.',',',event));" /><br>
<input type="text" name="multa" value="" size="10" maxlength="11" onkeypress="return(formataMoeda(this,'.',',',event));" /><br>
<input type="text" name="juros" value="" size="10" maxlength="11" onkeypress="return(formataMoeda(this,'.',',',event));" /><br>
<input type="text" name="total" value="" size="10" maxlength="11" onkeypress="return(formataMoeda(this,'.',',',event));" /><br>
</form>
E tambem uso uma função para formatar os campos.

 

Mas o resultado da operação não e exata exemplo: valor: 10,90 - desconto: 0.40 + multa: 0,00 + juros:0,00 = 10.00 o correto seria: 10,50

 

 

Agradeço qualquer informação

 

Atenciosamente

Janiel Oliveira

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu, pessoalmente, acho mais fácil começar tudo do zero do que tentar achar erro em código não tão extenso.

 

Refazendo o seu script, deu certo, o valor retornado foi 10.50, de acordo com as contas que você citou.

Talvez o erro possa ser na conversão do ponto para a vírgula. Em javascript, números com ponto flutuante, como o nome já diz, utiliza-se ponto, e não vírgula... isso quebra a cabeça de muito programador experiente, hehe! Eu não sou experiente, mas já perdi horas certa vez em um projeto tentando descobrir onde estava o maldito erro!!!

 

Teste o script abaixo em seu editor HTML:

<script type="text/javascript">
function somaParcela() {
		var valor = parseFloat(document.newParcela.valor.value);
		var desconto = parseFloat(document.newParcela.desconto.value);
		var multa = parseFloat(document.newParcela.multa.value);
		var juros = parseFloat(document.newParcela.juros.value);
		var soma = valor-desconto+multa+juros;
		document.newParcela.total.value = soma;
}
</script>
<form name="newParcela">
Valor: <input type="text" name="valor" size="10" maxlength="11"><br>
Desconto: <input type="text" name="desconto" value="" size="10" maxlength="11"><br>
Multa: <input type="text" name="multa" size="10" maxlength="11"><br>
Juros: <input type="text" name="juros" size="10" maxlength="11"><br>
Total: <input type="text" name="total" size="10" maxlength="11"><br>
<br><br><input type="button" onClick="somaParcela()" value="Total!">
</form>

Agora, o erro pode ser na conversão do ponto para vírgula, como parece que você está tentando fazer com o onKeyPress.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ja tentei dessa maneira que você fez mas mesmo assim não funcionou, o ponto e virgula fica atrapalhando.

 

Vou postar a função que uso para formatar os campos:

 

 

/* 
 * Formata Campo Moeda
 * SCRIPT: onKeyPress="return(formataMoeda(this,'.',',',event));"
 */

function formataMoeda(objTextBox, SeparadorMilesimo, SeparadorDecimal, e){
	var sep = 0;
	var key = '';
	var i = j = 0;
	var len = len2 = 0;
	var strCheck = '0123456789';
	var aux = aux2 = '';
	var whichCode = (window.Event) ? e.which : e.keyCode;
	// 13=enter, 8=backspace as demais retornam 0(zero)
	// whichCode==0 faz com que seja possivel usar todas as teclas como delete, setas, etc
	if ((whichCode == 13) || (whichCode == 0) || (whichCode == 8))
		return true;
	key = String.fromCharCode(whichCode); // Valor para o código da Chave


	if (strCheck.indexOf(key) == -1)
		return false; // Chave inválida
	len = objTextBox.value.length;
	for(i = 0; i < len; i++)
		if ((objTextBox.value.charAt(i) != '0') && (objTextBox.value.charAt(i) != SeparadorDecimal))
			break;
	aux = '';
	for(; i < len; i++)
		if (strCheck.indexOf(objTextBox.value.charAt(i))!=-1)
			aux += objTextBox.value.charAt(i);
	aux += key;
	len = aux.length;
	if (len == 0)
		objTextBox.value = '';
	if (len == 1)
		objTextBox.value = '0'+ SeparadorDecimal + '0' + aux;
	if (len == 2)
		objTextBox.value = '0'+ SeparadorDecimal + aux;
	if (len > 2) {
		aux2 = '';
		for (j = 0, i = len - 3; i >= 0; i--) {
			if (j == 3) {
				aux2 += SeparadorMilesimo;
				j = 0;
			}
			aux2 += aux.charAt(i);
			j++;
		}
		objTextBox.value = '';
		len2 = aux2.length;
		for (i = len2 - 1; i >= 0; i--)
			objTextBox.value += aux2.charAt(i);
		objTextBox.value += SeparadorDecimal + aux.substr(len - 2, len);
	}
	return false;
}

O resultado da soma tem que sair ja formatado, e não consigo esse resultado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal refiz o script, consegui fazer o calculo com precisão, mas agora tenho uma string não formatada preciso formatar ela. Alguma luz?

 

 

Novo Script:

<script type="text/javascript">
	function somaParcela() {
		var valor = document.forms['newParcela'].valor.value;
		var desconto = document.forms['newParcela'].desconto.value;
		var multa = document.forms['newParcela'].multa.value;
		var juros = document.forms['newParcela'].juros.value;
		var valor = valor.toString().replace( ".", "" );
		var valor = valor.toString().replace( ",", "" );
		var desconto = desconto.toString().replace( ".", "" );
		var desconto = desconto.toString().replace( ",", "" );
		var multa = multa.toString().replace( ".", "" );
		var multa = multa.toString().replace( ",", "" );
		var juros = juros.toString().replace( ".", "" );
		var juros = juros.toString().replace( ",", "" );

	var soma = parseFloat(valor)-parseFloat(desconto)+parseFloat(multa)+parseFloat(juros);
		 if(soma == 0){
			document.forms['newParcela'].valor.focus();
			return false;
		}
	  
		document.forms['newParcela'].total.value = eval(soma); //string que precisa ter o formato de moeda
	}
</script>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Expressoes Regulares:

 

v = v.replace(/[a-zA-Z\-\.,_$ ]/g, ""); //Remove caracteres
v = v.replace(/^(d{0})(\d{1,})(\d{2})/, "$1R\$ $2,$3");

v é a sua string...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, não entendi, eu ja limpei a string. Minha lógica foi:

 

 

Valor = 1,50 // valor da string

 

desconto = 0,50 // valor da string

 

 

valor = valor.replace(\.\,""); // REMOVE O PONTO

valor = valor.replace(\,\,""); //REMOVE VIRGULA

 

 

desconto = desconto .replace(\.\,""); // REMOVE O PONTO

desconto = desconto .replace(\,\,""); //REMOVE VIRGULA

 

soma = parseFloat(valor)-parseFloat(desconto); //subtrai do valor o desconto agora tenho uma string não formatada, preciso colocar ela no formato moeda com ponto e virgula

 

é ai que estou apanhando...

 

Agradeço pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

<script type="text/javascript">

function somaParcela() {

//Formato de entrada válido: m,nn ou m.nn;

//m: um ou mais números, sem pontos ou outros sinais;

var RegExp = /^([\d]+)[,.]([\d]{2})$/;

//Recebendo dados do formulário, ou seja, serão sempre strings:

var valor = document.newParcela.valor.value;

 

//Vamos converter a vírgula (caso exista) para ponto, pois ponto flutuante trabalha é com: PONTO;

if (valor != "") {

if (RegExp.test(valor) == true) {

valor = valor.replace(RegExp,"$1.$2");

} else {alert("Formato de entrada inválido em valor!"); document.newParcela.valor.select();}

}else{valor = 0.00;}

 

//Fazendo o mesmo para os demais campos:

var desconto = document.newParcela.desconto.value;

if (desconto != "") {

if (RegExp.test(desconto) == true) {desconto = desconto.replace(RegExp,"$1.$2");

} else {alert("Formato de entrada inválido em desconto!");}

}else{desconto = 0.00;}

 

var multa = document.newParcela.multa.value;

if (multa != "") {

if (RegExp.test(multa) == true) {multa = multa.replace(RegExp,"$1.$2");

} else {alert("Formato de entrada inválido em multa!");}

}else{multa = 0.00;}

 

var juros = document.newParcela.juros.value;

if (juros != "") {

if (RegExp.test(juros) == true) {juros = juros.replace(RegExp,"$1.$2");

} else {alert("Formato de entrada inválido em juros!");}

}else{juros = 0.00;}

 

//Convertendo as strings para ponto-flutuante, para realizarmos as contas numéricas;

//String não faz conta numérica!

var soma = parseFloat(valor)-parseFloat(desconto)+parseFloat(multa)+parseFloat(juros);

soma = soma.toFixed(2);

//Belezinha! a conta está feita, resta converter novamente a expressão para string, pois

//Ponto-flutuante não trabalha com vírgula!

soma = soma.toString();

 

//E por último, vamos converter o ponto para vírgula:

soma = soma.replace(".",",");

 

document.newParcela.total.value = soma;

}

</script>

<form name="newParcela">

Valor: <input type="text" name="valor" size="10" maxlength="11"><br>

Desconto: <input type="text" name="desconto" value="" size="10" maxlength="11"><br>

Multa: <input type="text" name="multa" size="10" maxlength="11"><br>

Juros: <input type="text" name="juros" size="10" maxlength="11"><br>

Total: <input type="text" name="total" size="10" maxlength="11"><br>

<br><br><input type="button" onClick="somaParcela()" value="Total!">

</form>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.