3

I am looking for help with javascript. We are trying to calculate and display the difference in percentage between a price before discount and a price after discount. The relevant classes are .from_price and .for_price. The prices look like this 160,00 and 130,00.

So we were trying with this code, but is doesn’t work:

var price = (Math.round($(".from_price").html())).toString();
var sale = (Math.round($(".for_price").html())).toString();
var korting = (Math.round(((sale - price)/price)*100)).toString();
$("#discount").html("You receive" + korting + "%" + " " + "discount");
}

Thanks so much for your help!

Tester
  • 31
  • 1
  • 2

4 Answers4

4

This is because you're using string values to get your discount value. You can transform 160,00 to 160 using parseFloat()

function getDiscount() {
  var price = parseFloat($(".from_price").html());
  var sale = parseFloat($(".for_price").html());
  console.log(price);
  console.log(sale);
  var korting = (Math.round(((sale - price)/price)*100));
  $("#discount").html("You receive" + korting + "%" + " " + "discount");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="from_price">160,00</div>
<div class="for_price">130,00</div>
<button type="button" onclick="getDiscount()">get discount</button>
<div id="discount"></div>
NicossB
  • 408
  • 2
  • 13
2

Don't use classnames as element selectors (what if your document contains multiple elements with class .from_price?). Don't depend on innerHTML for your (numeric) values. Using data-attributes for the pricing values gives you full control over it. I'd suggest to use css and a data-attribute to display the discount percentage. Finally, you don't really need jQuery for it.

Here's a simple (html in dutch) snippet to play with

(() => {
  const price = +document.querySelector("[data-fromprice]").dataset.fromprice;
  const sale = +document.querySelector("[data-forprice]").dataset.forprice;
  const discountPercentage = ((1-(sale/price)) * 100).toFixed(0);
  document.querySelector("[data-discount]").dataset.discount = discountPercentage;
})();
[data-discount]:before {
  content: attr(data-discount)'%';
  color: red;
  font-weight: bold;
}
<p>Van <span data-fromprice="160">€160,00</span></p>
<p>Voor <span data-forprice="130">€130,00</span>!</p>
<p>Uw korting: <span data-discount=""></span></p>
KooiInc
  • 119,216
  • 31
  • 141
  • 177
1

Here is an example:

var price = +((Math.round($(".from_price").html())).toString());
var sale =  +((Math.round($(".for_price").html())).toString());
var korting = (Math.round(((sale - price)/price)*100)).toString();

$("#discount").html("You receive "+ korting + " %discount");



console.log(typeof sale);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="from_price">100</div>
<div class="for_price">50</div>

<div id="discount"></div>

Your problem was that you trying to do calculations with strings this doesn't work like you expect. Therefore, I coerced your strings into numbers with the + sign and parentheses. Here is an example:

const el = document.getElementById('test').innerHTML;

console.log(el);
console.log(typeof el);

const sumString = el + el;

console.log(sumString); // the string 10 gets added to another string of 10 and thus forms 1010

const sumNr = parseFloat(el) +  +(el);  // now the strings are coered to numbers, both parseFloat and  +(yourvar) coerce strings to nubmers.
console.log(sumNr);
<div id="test">10</div>
Willem van der Veen
  • 33,665
  • 16
  • 190
  • 155
0
<!Doctype html>
<html>
<body>
    <input id="price">Price
    <br><br>
    <input id="discount">%
    <br><br>
    <button onclick="getPrice()">
Get total
</button>
    <br><br>
    <input readonly id="total">
    <script>
        getPrice = function() {
            var numVal1 = Number(document.getElementById("price").value);
            var numVal2 = Number(document.getElementById("discount").value) / 100;
            var totalValue = numVal1 - (numVal1 * numVal2)
            document.getElementById("total").value = totalValue.toFixed(2);
        }
    </script>
</body>
</html
Lan Danel
  • 55
  • 7