Ir para conteúdo

POWERED BY:

Arquivado

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

Go Back

Calcula de Reais Para Porcento

Recommended Posts

// calcula o real em cima da porcentagem e dá o valor final em cima da porcentagem
function calculaPorCento(){

var vi = parseFloat(document.frm.vi.value);
var desc = document.frm.desc;
var vf = document.frm.vf;
var desc_por = parseFloat(document.frm.desc_por.value);

var real = parseFloat((desc_por/100) * vi);
desc.value = real;
vf.value = parseFloat(vi - real);
}

// calcula a porcentagem em cima do real e dá o valor em cima do reald
function calculaReal(){
var vi = parseFloat(document.frm.vi.value);
var desc = parseFloat(document.frm.desc.value);
var vf = document.frm.vf;
var desc_por = document.frm.desc_por;

document.frm.submit.disabled = false;
vf.value = parseFloat(vi - desc);
var porcento = parseFloat((vf.value*100) / vi);
desc_por.value = 100 - porcento;
}

 

Eu tenho 4 campos no formulário:

 

Valor Inicial

Desconto em Reais

Desconto em Porcento

Valor Final

 

No campo Valor Inicial eu uso uma máscara para moeda onde coloca ponto e vírgula no valor.

Porém, na hora de fazer as contas, dá errado. =\

 

Eu tentei usar o parseFloat, mas não deu certo.

Como posso fazer isso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

usa um replace() pra remover a virgula, e o ponto

 

dai sim, faça os calculos.

lembre-se que as contas devem ser feitas no formato americano.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas não dá certo isso... vamos supoer que eu digite 5.000,00.

Daí eu uso o replace(). Ele tira o ponto e a vírgula, e vai me retornar isso: 500000.

 

Isso não é 5 Mil é 50 Mil.

 

Bom... mas se caiu minha ficha, ele vai fazer a conta e tals... daí eu volto o ponto e a vírgula de novo, ou não tem nada a ver ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, agora você começou a entender.

 

se tiver dúvidas com os 'centavos', depois de remover pontos e virgulas, divida por 100, ai você terá os teus 5 mil em formato americano.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza... entendi e fiz aqui...

Mas tem um outro problema.

 

Quando eu digito o desconto em reais é pra ele me mostrar o equivalente a desconto em porcento.

Se eu digito em porcento é para me mostrar o desconto equivalente em reais.

 

Quando eu digito no desconto em reais 10. ele parece no desconto 0.2000000 e quando eu saio do foco do campo de desconto em porcento ele calcula o equivalente em reais e taca 10.0000000000.

 

Como tiro isso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao sei, nao deu pra entender o referencial..

 

e você precisa mostrar algum codigo para vermos como você fez.

 

html + js minimos necessarios para rodarmos teu script.

Compartilhar este post


Link para o post
Compartilhar em outros sites

js

// calcula o real em cima da porcentagem e dá o valor final em cima da porcentagem
function calculaPorCento(){

var vi = document.frm.vi.value;
var desc = document.frm.desc;
var vf = document.frm.vf;
var desc_por = document.frm.desc_por.value;

vi = vi.replace(".","");
vi = vi.replace(",","");
desc_por = desc_por.replace(",","");
desc_por = desc_por.replace(",","");

vi = (vi/100);

var real = (desc_por/100) * vi;
desc.value = parseFloat(real);
vf.value = vi - real;

/*	
if(desc_por > 5)
{
	alert("Você só pode dar descontos até 5% do valor inicial! Para mais informações consulte seu diretor!");
	document.frm.submit.disabled = true;
	return(false);
}
else
	document.frm.submit.disabled = false;*/
}

// calcula a porcentagem em cima do real e dá o valor em cima do reald
function calculaReal(){
var vi = document.frm.vi.value;
var desc = document.frm.desc.value;
var vf = document.frm.vf;
var desc_por = document.frm.desc_por;

vi = vi.replace(".","");
vi = vi.replace(",","");
desc = desc.replace(",","");
desc = desc.replace(",","");

vi = (vi/100);

document.frm.submit.disabled = false;
vf.value = vi - desc;
var porcento = (vf.value*100) / vi;
desc_por.value = 100 - porcento;

/*
if(desc_por.value > 5)
{
	alert("Você só pode dar descontos até 5% do valor inicial! Para mais informações consulte seu diretor!");
	document.frm.submit.disabled = true;
	return(false);
}
else
	document.frm.submit.disabled = false;*/	
}

/* Máscaras ER */
function mascara(o,f){
   v_obj=o
   v_fun=f
   setTimeout("execmascara()",1)
}
function execmascara(){
   v_obj.value=v_fun(v_obj.value)
}
function mvalor(v){
   v=v.replace(/\D/g,"");//Remove tudo o que não é dígito
   v=v.replace(/(\d)(\d{8})$/,"$1.$2");//coloca o ponto dos milhões
   v=v.replace(/(\d)(\d{5})$/,"$1.$2");//coloca o ponto dos milhares

   v=v.replace(/(\d)(\d{2})$/,"$1,$2");//coloca a virgula antes dos 2 últimos dígitos
   return v;
}

 

html

	<tr>
		<td>Valor Inicial</td>
		<td><input type='text' name='vi' id='vi' maxlength='' size='10' onkeypress="mascara( this, mvalor );"/></td>
	</tr>
	<tr>
		<td>Desconto em R$</td>
		<td><input type='text' name='desc' id='desc' maxlength='' size='10' onblur="if(this.value != '') return calculaReal()" onkeypress="mascara( this, mvalor );"/></td>
	</tr>
	<tr>
		<td>Desconto em %</td>
		<td><input type='text' name='desc_por' id='desc_por' maxlength='' size='10'  onblur="if(this.value != '') return calculaPorCento()"/></td>
	</tr>
	<tr>
		<td>Valor Final</td>
		<td><input type='text' name='vf' id='vf' maxlength='' size='10' readonly="readonly" /></td>
	</tr>

Compartilhar este post


Link para o post
Compartilhar em outros sites

não use a forma:

document.frm.vi.value;

prefira fazer

document.getElementById('vi').value;//lembrando de declarar id nesse elemento

 

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

que trabalheira hein?!

olha pra ER na função mvalor, tente entender o código, e reaproveitar procedimentos, vai diminuir teu trabalho.

 

 

 type='text' name='vi' 

use aspas duplas para delimitar os valores dos atributos html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tentei chamar a função mvalor dentro desse código mas deu erro... no firebug falou que nao reconhecia a função... =\

Compartilhar este post


Link para o post
Compartilhar em outros sites

não foi bem isso que eu quis dizer ^^

 

era pra você olhar essa linha:

v=v.replace(/\D/g,"");//Remove tudo o que não é dígito

e comparar com essa:

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

 

leia meu post acima novamente, editei ele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim.

 

pois você só precisa 'remover a virgula e o ponto', e não formatar a string, você quer desformatar.

 

vou ser mais explicito, troque:

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

por:

vi = vi.replace(/\D/g,"");//Remove tudo o que não é dígito

se você notar que vai ter que fazer esse mesmo procedimento em outros locais, crie uma function que receba a string formatada, e devolva o float sem formatação, já na notação americana.

Compartilhar este post


Link para o post
Compartilhar em outros sites

haa entendi...

nao entendo de ER... esse é o problema =\

faz tempo que quero estudar isso, mas nao dá tempo... eh um proj atras do outro.

 

vo testar

 

Entao...

agora está dando aquele negócio que falei acima... faça o teste aí.

Digita 5.000,00

Digita 10,00 de desconto e veja o que aparece em descontos %, 0.2000000 Dae você volta no de cima quando sai do foco fica 10.00000000

 

só falta isso!

Compartilhar este post


Link para o post
Compartilhar em outros sites

codigo com as sugestões:

<html> 
<head>
<script type="text/javascript"> 
function calculaPorCento()
{

var vi = toFloat( id('vi').value )/100;
var desc = id('desc').value;
var vf = id('vf');
var desc_por = toFloat( id('desc_por').value );


var real = (desc_por/100) * vi;
desc.value = parseFloat(real);
vf.value = vi - real;
}
function calculaReal()
{
var vi = toFloat( id('vi').value )/100;
var desc = toFloat( id('desc').value )/100;
var vf = id('vf');
var desc_por = id('desc_por');

vf.value = vi - desc;	
var porcento = ( vf.value*100 ) / vi;
desc_por.value = 100 - porcento;
}
function id( el ){
return document.getElementById( el );
}
/* Máscaras ER */
function toFloat( str )
{
return str.replace(/\D/g,'');
}
function mascara(o,f){
   v_obj=o
   v_fun=f
   setTimeout("execmascara()",1)
}
function execmascara(){
   v_obj.value=v_fun(v_obj.value)
}
function mvalor(v){
   v=v.replace(/\D/g,"");//Remove tudo o que não é dígito
   v=v.replace(/(\d)(\d{8})$/,"$1.$2");//coloca o ponto dos milhões
   v=v.replace(/(\d)(\d{5})$/,"$1.$2");//coloca o ponto dos milhares

   v=v.replace(/(\d)(\d{2})$/,"$1,$2");//coloca a virgula antes dos 2 últimos dígitos
   return v;
}
</script> 
</head>
<body>
<form action="" method="get">
<table>
	<tr>
		<td>Valor Inicial</td>
		<td><input type="text" name="vi" id="vi" maxlength="" size='10' onkeypress="mascara( this, mvalor );"/></td>
	</tr>
	<tr>
		<td>Desconto em R$</td>
		<td><input type="text" name="desc" id="desc" maxlength="" size='10' onblur="if(this.value != '') return calculaReal();" onkeypress="mascara( this, mvalor );"/></td>
	</tr>
	<tr>
		<td>Desconto em %</td>
		<td><input type="text" name="desc_por" id="desc_por" maxlength="" size='10'  onblur="if(this.value != '') return calculaPorCento();"/></td>
	</tr>
	<tr>
		<td>Valor Final</td>
		<td><input type="text" name="vf" id="vf" maxlength="" size='10' readonly="readonly" /></td>
	</tr>
</table>
</form> 
</body> 
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

William ficou do mesmo jeito... aí funcionou ?

aqui eu coloquei 5.000,00 depois 10,00

apareceu 0.200000

 

E o valor final 4990.

 

To tentando resolver esses dois problemas, tirar o excesso de 0 e formatar o valor final.

 

=\

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou com este mesmo problema, no meu caso resolvi tudo na POG.

 

Vou acompanhar e se pudar ajudar em algo irei postar aqui tambem.

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

formatar o valor final é simples.

Veja se ele possui os centavos, se não coloque (if mesmo)

 

para remover os zeros excessivos, você pode tentar usar um toFixed()

http://www.w3schools.com/jsref/jsref_tofixed.asp

 

ou arredondar o numero.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Encontrei o seu exemplo e estou precisando de alguns ajustes no código, são os seguintes ... gostaria que quando digitasse o valor inicial e o campo de % ele preencher o campo do desconto em R$ , ou se preencher o valor em R$ , ele preencher o campo equivalente em % , ou seja os 2 fossem interligados ... Por exemplo ... Valor inicial = 100,00 , e no campo % eu coloco 10 , ai preencheria o campo desconto em R$ com 10,00 ... ou coloco o valor de R$ 45,00 ele preencher o campo % com 45 ... como faço pra realizar esse procedimento?

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.