[removed] Currency converter

2019-08-11 00:15发布

问题:

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);
}}

回答1:

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;
}