Como Calcular e alterar Valor a Valor de uma Lista <li>

Prezados,
Sou novo no forum e preciso de uma ajuda.
Preciso alterar o valor final de cada produto, incluindo um desconto de 7% no valor “Por” de cada produto e esconder o valor “Por” original mantendo só o valor com o desconto.

Segue o código que criei, porém não funcionou, pois ele pega o resultado do calculo do primeiro produto encontrado e cria nos outros o mesmo valor, tentei correr com o .each do jquery mas não fui muito feliz:

<ul>
		<li>
			<div class="data">
				<p class="price">
					<a href="#">
						<span class="oldPrice"><span>De: </span>R$ 149,00</span>
						<span class="newPrice"><span>Por: </span><em>R$ 121,90</em></span>
					</a>
				</p>
			</div>
		</li>
		<li>
			<div class="data">
				<p class="price">
					<a href="#">
						<span class="oldPrice"><span>De: </span>R$ 139,00</span>
						<span class="newPrice"><span>Por: </span><em>R$ 90,90</em></span>
					</a>
				</p>
			</div>
		</li>
	</ul>
	<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
	<script type="text/javascript">
function _desconto(descontoValor, valor){
    var valor;
    //Desconto vindo do site
    valor = valor-(valor*descontoValor/100);
    return valor;
}

$(document).ready(function() {

    $(".newPrice").hide();
    var descricao_preco = $('.price a');
    var stringTotal = $(".newPrice").text().split('R$ ');
    var valorTotal = stringTotal[1];
    var valorSplit = valorTotal.split(",");
    var reais = valorSplit[0];
    var centavos = valorSplit[1];
    reais = reais.replace('.', '');
    var precoString = reais+'.'+centavos;
    var precoFloat = parseFloat(precoString);
    var desconto = _desconto(7, precoFloat);
    desconto = desconto.toFixed(2);
    var descontoString = desconto.toString();
    if(descontoString.indexOf('.')==3 || descontoString.indexOf('.')==2 || descontoString.indexOf('.')==1){
        descontoString = descontoString.replace('.', ',');
    }
    if(descontoString.indexOf('.')==4){
        descontoString = descontoString.replace('.', ',');
        descontoString = descontoString.replace(/(.{1})/,"$1.");
    }

    descricao_preco.append('<span class="desc-boleto"><span>Por:</span><em>R$ '+descontoString+'</em></span>');
});
	</script>

[quote=danilotremere]Prezados,
Sou novo no forum e preciso de uma ajuda.
Preciso alterar o valor final de cada produto, incluindo um desconto de 7% no valor “Por” de cada produto e esconder o valor “Por” original mantendo só o valor com o desconto.

Segue o código que criei, porém não funcionou, pois ele pega o resultado do calculo do primeiro produto encontrado e cria nos outros o mesmo valor, tentei correr com o .each do jquery mas não fui muito feliz:

... [/quote]
Aqui o valor sempre está dando R$ 113,37, independente do valor de entrada. Deve ter algum erro de cálculo aí.
Ah, e acho que vc teria que criar um array com todos elementos da classe onde aparece o valor e o desconto, aí você poderia calcular alterar todos os elementos do array com o script.

Só uma dúvida: O valor sem desconto (De: ) virá do banco de dados, ou já é estático na página?

[quote=Erick Ribeiro][quote=danilotremere]Prezados,
Sou novo no forum e preciso de uma ajuda.
Preciso alterar o valor final de cada produto, incluindo um desconto de 7% no valor “Por” de cada produto e esconder o valor “Por” original mantendo só o valor com o desconto.

Segue o código que criei, porém não funcionou, pois ele pega o resultado do calculo do primeiro produto encontrado e cria nos outros o mesmo valor, tentei correr com o .each do jquery mas não fui muito feliz:

... [/quote]
Aqui o valor sempre está dando R$ 113,37, independente do valor de entrada. Deve ter algum erro de cálculo aí.
Ah, e acho que vc teria que criar um array com todos elementos da classe onde aparece o valor e o desconto, aí você poderia calcular alterar todos os elementos do array com o script.

Só uma dúvida: O valor sem desconto (De: ) virá do banco de dados, ou já é estático na página?[/quote]

Erick, cheguei a pensar nisso mas não consigo achar uma maneira de implementar esse código com um array.
Você tem alguma sugestão de como fazer?

[quote=Erick Ribeiro][quote=danilotremere]Prezados,
Sou novo no forum e preciso de uma ajuda.
Preciso alterar o valor final de cada produto, incluindo um desconto de 7% no valor “Por” de cada produto e esconder o valor “Por” original mantendo só o valor com o desconto.

Segue o código que criei, porém não funcionou, pois ele pega o resultado do calculo do primeiro produto encontrado e cria nos outros o mesmo valor, tentei correr com o .each do jquery mas não fui muito feliz:

... [/quote]
Aqui o valor sempre está dando R$ 113,37, independente do valor de entrada. Deve ter algum erro de cálculo aí.
Ah, e acho que vc teria que criar um array com todos elementos da classe onde aparece o valor e o desconto, aí você poderia calcular alterar todos os elementos do array com o script.

Só uma dúvida: O valor sem desconto (De: ) virá do banco de dados, ou já é estático na página?[/quote]

Erick, cheguei a pensar nisso mas não consigo achar uma maneira de implementar esse código com um array.
Você tem alguma sugestão de como fazer?

Você pode usar o each, não vejo problema.

function converteParaCentavos(numero) {
   return numero.replace(/[^0-9]/g, '');
}
	
function converteParaReais(numero) {
   return 'R$ ' + (numero / 100).toFixed(2).replace('.', ',');
}
	
$('.newPrice em').each(function(index, value) {
   var total = converteParaCentavos($(value).text());
   total = _desconto(7, total);
   total = converteParaReais(total);
   $(value).text(total);
});

Veja que eu converti o número para centavos, sem considerar casas decimais. Usar float em javascript (assim como em java) para cálculos monetários é perigoso, ele não é preciso. Em Java usamos BigDecimal e em Javascript convertemos para inteiro e dividimos por 100 após os cálculos.

[quote=wagnerfrancisco]Você pode usar o each, não vejo problema.

function converteParaCentavos(numero) {
   return numero.replace(/[^0-9]/g, '');
}
	
function converteParaReais(numero) {
   return 'R$ ' + (numero / 100).toFixed(2).replace('.', ',');
}
	
$('.newPrice em').each(function(index, value) {
   var total = converteParaCentavos($(value).text());
   total = _desconto(7, total);
   total = converteParaReais(total);
   $(value).text(total);
});

Veja que eu converti o número para centavos, sem considerar casas decimais. Usar float em javascript (assim como em java) para cálculos monetários é perigoso, ele não é preciso. Em Java usamos BigDecimal e em Javascript convertemos para inteiro e dividimos por 100 após os cálculos.[/quote]

Muito obrigado wagnerfrancisco, salvou minha vida… :lol:
moderador se quiser pode fechar o topico.