Search code examples
javascriptconverterscurrency

Javascript: Currency converter


Im new in javascript and I'm trying to make a simple currency converter, it is working fine when I select "£Pound" "£Pound" or "£Pound" "R$Real" but when I select "R$Real" "R$Real" runs the "Pound" "R$Real" calculation.

I spent hours trying to figure this out (very frustrating).

How to fix it? Is there another way to do it? (also tried using " if " and " else if " same issue). Thanks!

Here`s the HTML:

<label>Amount:</label>
<input type="text" id="amount" />
<label>From:</label>
<select id="select1">
    <option value="pound">&pound; Pound</option>
    <option value="real">R$ Real</option>
</select>
<label>To:</label>
<select id="select2">
    <option value="pound">&pound; Pound</option>
    <option value="real">R$ Real</option>
</select>
<input type="button" onClick="calculation()" value="calculate" />
<div id="result"></div>

Here`s the JS:

function calculation() {
var amount = document.getElementById('amount').value;
var currency1 = document.getElementById('select1').value;
var currency2 = document.getElementById('select2').value;

switch((currency1)&&(currency2)){
    case "pound":
    case "pound":
        var y = amount * 1;
        document.getElementById('result').innerHTML = "&pound; " + parseFloat(Math.round(y * 100) / 100).toFixed(2);
        break
    case "pound":
    case "real":
        var x = currency2 = 3.40;
        var y = amount * x;
        document.getElementById('result').innerHTML = "R$ " + parseFloat(Math.round(y * 100) / 100).toFixed(2);
        break
    case "real":
    case "real":
        var y = amount * 1;
        document.getElementById('result').innerHTML = "R$ " + parseFloat(Math.round(y * 100) / 100).toFixed(2);
        break
    case "real":
    case "pound":
        var x = currency2 = 3.40;
        var y = amount / x;
        document.getElementById('result').innerHTML = "&pound; " + parseFloat(Math.round(y * 100) / 100).toFixed(2);
}}

Solution

  • To fix your JS do the following:

    The issue is that your switch would compute to a single string, and you are using fall-through switch statements, jsFiddle to demonstrate what I mean.

    Switch Statement Documentation for JavaScript

    function calculation() {
        var amount = document.getElementById('amount').value;
        var currency1 = document.getElementById('select1').value;
        var currency2 = document.getElementById('select2').value;
    
        switch (currency1 + ' ' + currency2) {
            case "pound pound":
                var y = amount * 1;
                document.getElementById('result').innerHTML = "&pound; " + parseFloat(Math.round(y * 100) / 100).toFixed(2);
                break
            case "pound real":
                var x = currency2 = 3.40;
                var y = amount * x;
                document.getElementById('result').innerHTML = "R$ " + parseFloat(Math.round(y * 100) / 100).toFixed(2);
                break
            case "real real":
                var y = amount * 1;
                document.getElementById('result').innerHTML = "R$ " + parseFloat(Math.round(y * 100) / 100).toFixed(2);
                break
            case "real pound":
                var x = currency2 = 3.40;
                var y = amount / x;
                document.getElementById('result').innerHTML = "&pound; " + parseFloat(Math.round(y * 100) / 100).toFixed(2);
        }
    }
    

    Use the below to display the number and then just put the symbol in front, as this code will add commas and separators in the right spots, including negative.

    Format number to currency:

    function formatCurrency(num, precision) {
      //identify '(123)' as a negative number
      if (typeof num == 'string' && num.toString().indexOf('\\(') >= 0) {
        num = '-' + num;
      }
    
      if (num === '' || (num === '-' && precision === -1)) {
        return;
      }
    
      // if the number is valid use it, otherwise clean it
      if (isNaN(num)) {
        // clean number
        if (num === '' || (num === '-' && precision === -1)) {
          return;
        }
    
        if (isNaN(num)) {
          num = '0';
        }
      }
    
      // evalutate number input
      var numParts = String(num).split('.');
      var isPositive = (num == Math.abs(num));
      var hasDecimals = (numParts.length > 1);
      var decimals = (hasDecimals ? numParts[1].toString() : '0');
      var originalDecimals = decimals;
    
      // format number
      num = Math.abs(numParts[0]);
      num = isNaN(num) ? 0 : num;
      if (precision >= 0) {
        decimals = parseFloat('1.' + decimals); // prepend "0."; (IE does NOT round 0.50.toFixed(0) up, but (1+0.50).toFixed(0)-1
        decimals = decimals.toFixed(precision); // round
        if (decimals.substring(0, 1) == '2') {
          num = Number(num) + 1;
        }
        decimals = decimals.substring(2); // remove "0."
      }
      num = String(num);
    
      for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
        num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
      }
    
      if ((hasDecimals && precision == -1) || precision > 0) {
        num += '.' + decimals;
      }
    
      // format symbol/negative
      var format = isPositive ? '%s%n' : '(%s%n)';
      var money = format.replace(/%s/g, '$');
      money = money.replace(/%n/g, num);
      return money;
    }
    
    console.log(formatCurrency(12002031203120, 2))