Come convertire una stringa di valuta in un doppio con jQuery o Javascript?


237

Ho una casella di testo che contiene una stringa di valuta che devo quindi convertire quella stringa in doppio per eseguire alcune operazioni su di essa.

"$1,100.00"1100.00

Questo deve avvenire su tutto il lato client. Non ho altra scelta che lasciare la stringa di valuta come stringa di valuta come input, ma devo lanciarla / convertirla in un doppio per consentire alcune operazioni matematiche.

Risposte:


480

Rimuovi tutti i punti / cifre:

var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));

4
Sembra che funzioni solo dove c'è un .00finale. Altrimenti rappresentazioni di valuta valide come "$ 1100" e "$ 1100". sarà ridotto di due ordini di grandezza.
Brian M. Hunt,

19
Tieni presente che questo dipende dalle impostazioni locali, poiché altri locali utilizzano "," per i decimali (ad es. 1.100,00 €). Alcuni altri locali utilizzano anche un numero standard diverso di cifre per gruppo (come 3 decimali).
smola,

8
Per gestire i numeri negativi nella stringa, ho aggiunto un '-' all'elenco dei caratteri da accettare, ovvero .replace (/ [^ 0-9 - \.] + / G, "")
tonycoupland

4
Inoltre, tieni presente che alcune app di contabilità racchiudono i numeri tra parentesi per indicare valori negativi. ad esempio: ($ 5,00) = - $ 5,00
Dave L

1
So che potrei essere in ritardo di diversi anni per rispondere qui, ma devi anche stare attento se "currency = 0." otterrai un errore javascript che dice che currency.replace non è una funzione. Ho appena aggiunto un semplice controllo se currency = 0 per evitare questo.
Allen

23

accounting.js è la strada da percorrere. L'ho usato in un progetto e ho avuto un'ottima esperienza nell'usarlo.

accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
accounting.unformat("€ 1.000.000,00", ","); // 1000000

Lo si può trovare a GitHub


6
Aggiornamento: quella libreria ha 71 problemi aperti e non è stata modificata da 5 mesi, quindi non mi fido di questo. github.com/openexchangerates/accounting.js/issues
Ryan

20

Usa una regex per rimuovere la formattazione (dollaro e virgola) e usa parseFloat per convertire la stringa in un numero in virgola mobile.`

var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;

8
Vale la pena notare che non dovresti usare il float per applicazioni non "Toy" quando aggiungi valuta. Ti ritroverai con totali non esatti.
Ally,

6
Sarai sorpreso e infelice quando parseFloat ("151.20" * 100) ti dà 15119.99999999999998 ma parseFloat ("151.40" * 100) ti dà 15140. Non usare mai parseFloat per soldi. Utilizzare librerie specifiche per gestire il denaro, come accounting.js o uno qualsiasi degli altri suggeriti qui.
bambery,

15

So che questa è una vecchia domanda, ma volevo dare un'opzione aggiuntiva.

JQuery Globalize offre la possibilità di analizzare un formato specifico della cultura su un float.

https://github.com/jquery/globalize

Data una stringa "$ 13.042,00" e Globalize impostato su en-US:

Globalize.culture("en-US");

È possibile analizzare il valore float in questo modo:

var result = Globalize.parseFloat(Globalize.format("$13,042.00", "c"));

Questo ti darà:

13042.00

E ti permette di lavorare con altre culture.


10

So che questa è una vecchia domanda, ma la risposta di CMS sembra avere un piccolo piccolo difetto: funziona solo se il formato della valuta usa "." come separatore decimale. Ad esempio, se devi lavorare con rubli russi, la stringa apparirà così: "1 000,00 rub".

La mia soluzione è molto meno elegante di quella del CMS, ma dovrebbe fare il trucco.

var currency = "1 000,00 rub."; //it works for US-style currency strings as well
var cur_re = /\D*(\d+|\d.*?\d)(?:\D+(\d{2}))?\D*$/;
var parts = cur_re.exec(currency);
var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00'));
console.log(number.toFixed(2));

ipotesi:

  • il valore della valuta utilizza la notazione decimale
  • non ci sono cifre nella stringa che non fanno parte del valore della valuta
  • il valore della valuta contiene 0 o 2 cifre nella sua parte frazionaria *

Il regexp può persino gestire qualcosa come "1.999 dollari e 99 centesimi", anche se non è una funzionalità prevista e non dovrebbe essere invocato.

Spero che questo possa aiutare qualcuno.


Grazie. Migliore risposta. Semplice e potente. Lo userei con (\ D *) (\ d. *? \ D) (?: \ D + (\ d {2} | -))? (\ D *) $ per ottenere la valuta e - per centesimi. Quindi puoi analizzare stringhe come 1.000, - € anche. La valuta sarà in parti [1] o in parte [4] e la parte [3] include i centesimi come numero o -. Quindi puoi normalizzare la stringa come vuoi.
CyberAleks il

Questo è molto brutto e pericoloso, moltiplica i numeri meno di 10 per 100. L'ho usato stupidamente prima di testare tutti i numeri con esso :(
sheavens

@sheavens grazie per averlo segnalato. Ci scusiamo per averlo risolto così tardi, ma la nuova versione funziona anche per quelle somme.
Vindicar,


6

// "10.000.500,61 TL" price_to_number => 10000500.61

// "10000500.62" number_to_price => 10.000.500,62

JS FIDDLE: https://jsfiddle.net/Limitlessisa/oxhgd32c/

var price="10.000.500,61 TL";
document.getElementById("demo1").innerHTML = price_to_number(price);

var numberPrice="10000500.62";
document.getElementById("demo2").innerHTML = number_to_price(numberPrice);

function price_to_number(v){
    if(!v){return 0;}
    v=v.split('.').join('');
    v=v.split(',').join('.');
    return Number(v.replace(/[^0-9.]/g, ""));
}

function number_to_price(v){
    if(v==0){return '0,00';}
    v=parseFloat(v);
    v=v.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
    v=v.split('.').join('*').split(',').join('.').split('*').join(',');
    return v;
}


3

Questa è la mia funzione Funziona con tutte le valute ..

function toFloat(num) {
    dotPos = num.indexOf('.');
    commaPos = num.indexOf(',');

    if (dotPos < 0)
        dotPos = 0;

    if (commaPos < 0)
        commaPos = 0;

    if ((dotPos > commaPos) && dotPos)
        sep = dotPos;
    else {
        if ((commaPos > dotPos) && commaPos)
            sep = commaPos;
        else
            sep = false;
    }

    if (sep == false)
        return parseFloat(num.replace(/[^\d]/g, ""));

    return parseFloat(
        num.substr(0, sep).replace(/[^\d]/g, "") + '.' + 
        num.substr(sep+1, num.length).replace(/[^0-9]/, "")
    );

}

Utilizzo: toFloat("$1,100.00")otoFloat("1,100.00$")


3

Puoi provare questo

var str = "$1,112.12";
str = str.replace(",", "");
str = str.replace("$", "");
console.log(parseFloat(str));


2
jQuery.preferCulture("en-IN");
var price = jQuery.format(39.00, "c");

l'output è: Rs. 39.00

use jquery.glob.js,
    jQuery.glob.all.js

0
    $ 150.00
    Fr. 150.00
     689.00

Ho testato sopra tre simboli di valuta. Puoi farlo anche per altri.

    var price = Fr. 150.00;
    var priceFloat = price.replace(/[^\d\.]/g, '');

L'espressione regolare sopra rimuoverà tutto ciò che non è una cifra o un punto. Quindi puoi ottenere la stringa senza il simbolo di valuta ma in caso di "Fr. 150,00" se consoli per l'output otterrai il prezzo come

    console.log('priceFloat : '+priceFloat);

    output will be like  priceFloat : .150.00

che è sbagliato, quindi controlla l'indice di "." quindi dividerlo e ottenere il risultato corretto.

    if (priceFloat.indexOf('.') == 0) {
            priceFloat = parseFloat(priceFloat.split('.')[1]);
    }else{
            priceFloat = parseFloat(priceFloat);
    }

0
function NumberConvertToDecimal (number) {
    if (number == 0) {
       return '0.00'; 
    }
    number = parseFloat(number);
    number = number.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1");
    number = number.split('.').join('*').split('*').join('.');
    return number;
}

0
var parseCurrency = function (e) {
    if (typeof (e) === 'number') return e;
    if (typeof (e) === 'string') {
        var str = e.trim();
        var value = Number(e.replace(/[^0-9.-]+/g, ""));
        return str.startsWith('(') && str.endsWith(')') ? -value: value;
    }

    return e;
} 

0

Questa funzione dovrebbe funzionare indipendentemente dalle impostazioni locali e della valuta:

function getNumPrice(price, decimalpoint) {
    var p = price.split(decimalpoint);
    for (var i=0;i<p.length;i++) p[i] = p[i].replace(/\D/g,'');
    return p.join('.');
}

Questo presuppone che tu conosca il carattere del punto decimale (nel mio caso la locale è impostata da PHP, quindi lo capisco con <?php echo cms_function_to_get_decimal_point(); ?>).


0

Questo ha funzionato per me e copre la maggior parte dei casi limite :)

function toFloat(num) {
  const cleanStr = String(num).replace(/[^0-9.,]/g, '');
  let dotPos = cleanStr.indexOf('.');
  let commaPos = cleanStr.indexOf(',');

  if (dotPos < 0) dotPos = 0;

  if (commaPos < 0) commaPos = 0;

  const dotSplit = cleanStr.split('.');
  const commaSplit = cleanStr.split(',');

  const isDecimalDot = dotPos
    && (
      (commaPos && dotPos > commaPos)
      || (!commaPos && dotSplit[dotSplit.length - 1].length === 2)
    );

  const isDecimalComma = commaPos
    && (
      (dotPos && dotPos < commaPos)
      || (!dotPos && commaSplit[commaSplit.length - 1].length === 2)
    );

  let integerPart = cleanStr;
  let decimalPart = '0';
  if (isDecimalComma) {
    integerPart = commaSplit[0];
    decimalPart = commaSplit[1];
  }
  if (isDecimalDot) {
    integerPart = dotSplit[0];
    decimalPart = dotSplit[1];
  }

  return parseFloat(
    `${integerPart.replace(/[^0-9]/g, '')}.${decimalPart.replace(/[^0-9]/g, '')}`,
  );
}
toFloat('USD 1,500.00'); // 1500
toFloat('USD 1,500'); // 1500
toFloat('USD 500.00'); // 500
toFloat('USD 500'); // 500

toFloat('EUR 1.500,00'); // 1500
toFloat('EUR 1.500'); // 1500
toFloat('EUR 500,00'); // 500
toFloat('EUR 500'); // 500
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.