Wie konvertiere ich eine Währungszeichenfolge mit jQuery oder Javascript in ein Double?


237

Ich habe ein Textfeld mit einer Währungszeichenfolge , die ich dann in eine doppelte Zeichenfolge konvertieren muss, um einige Operationen daran auszuführen.

"$1,100.00"1100.00

Dies muss auf der gesamten Clientseite erfolgen. Ich habe keine andere Wahl, als die Währungszeichenfolge als Währungszeichenfolge als Eingabe zu belassen, muss sie jedoch in ein Double umwandeln, um einige mathematische Operationen zu ermöglichen.

Antworten:


480

Entfernen Sie alle Nicht-Punkte / Ziffern:

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

4
Es scheint, dass dies nur dort funktioniert, wo es ein .00Trailing gibt. Ansonsten gültige Währungsangaben wie "$ 1100" und "$ 1100". wird um zwei Größenordnungen reduziert.
Brian M. Hunt

19
Beachten Sie, dass dies vom Gebietsschema abhängig ist, da andere Gebietsschemas ',' für Dezimalstellen verwenden (z. B. 1.100,00 €). Einige andere Gebietsschemas verwenden sogar eine andere Standardanzahl von Ziffern pro Gruppe (z. B. 3 Dezimalstellen).
Smola

8
Um negative Zahlen in der Zeichenfolge zu behandeln, habe ich der Liste der zu akzeptierenden Zeichen ein '-' hinzugefügt, dh .replace (/ [^ 0-9 - \.] + / G, "")
tonycoupland

4
Beachten Sie auch, dass einige Buchhaltungs-Apps Zahlen in Klammern setzen, um negative Werte zu kennzeichnen. Beispiel: ($ 5,00) = - $ 5,00
Dave L

1
Ich weiß, dass ich möglicherweise einige Jahre zu spät antworte, aber Sie müssen auch vorsichtig sein, wenn "Währung = 0". Sie erhalten einen Javascript-Fehler, der besagt, dassrency.replace keine Funktion ist. Ich habe gerade eine einfache Überprüfung hinzugefügt, ob Währung = 0 ist, um dies zu vermeiden.
Allen


20

Verwenden Sie einen regulären Ausdruck, um die Formatierung (Dollar und Komma) zu entfernen, und verwenden Sie parseFloat, um die Zeichenfolge in eine Gleitkommazahl zu konvertieren. "

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

7
Es ist erwähnenswert, dass Sie float nicht für Nicht-Toy-Anwendungen verwenden sollten, wenn Sie Währung hinzufügen. Sie werden am Ende nicht genaue Summen haben.
Verbündeter

6
Sie werden überrascht und unglücklich sein, wenn parseFloat ("151.20" * 100) Ihnen 15119.999999999998 gibt, parseFloat ("151.40" * 100) Ihnen 15140. Verwenden Sie parseFloat niemals für Geld. Verwenden Sie bestimmte Bibliotheken für den Umgang mit Geld, z. B. Accounting.js oder eine der hier vorgeschlagenen.
Bambery

15

Ich weiß, dass dies eine alte Frage ist, wollte aber eine zusätzliche Option geben.

Mit jQuery Globalize können Sie ein kulturspezifisches Format in einem Float analysieren.

https://github.com/jquery/globalize

Bei einer Zeichenfolge "$ 13.042,00" und Globalize auf en-US gesetzt:

Globalize.culture("en-US");

Sie können den Float-Wert folgendermaßen analysieren:

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

Dies wird Ihnen geben:

13042.00

Und ermöglicht es Ihnen, mit anderen Kulturen zu arbeiten.


10

Ich weiß, dass dies eine alte Frage ist, aber die Antwort von CMS scheint einen winzigen kleinen Fehler zu haben: Sie funktioniert nur, wenn das Währungsformat "" verwendet. als Dezimaltrennzeichen. Wenn Sie beispielsweise mit russischen Rubeln arbeiten müssen, sieht die Zeichenfolge folgendermaßen aus: "1 000,00 rub."

Meine Lösung ist weit weniger elegant als die von CMS, sollte aber den Trick machen.

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

Annahmen:

  • Der Währungswert verwendet die Dezimalschreibweise
  • Die Zeichenfolge enthält keine Ziffern, die nicht Teil des Währungswerts sind
  • Der Währungswert enthält entweder 0 oder 2 Ziffern in seinem Bruchteil *

Der reguläre Ausdruck kann sogar mit so etwas wie "1.999 Dollar und 99 Cent" umgehen, obwohl dies keine beabsichtigte Funktion ist und man sich nicht darauf verlassen sollte.

Hoffe das wird jemandem helfen.


Danke dir. Beste Antwort. Einfach und mächtig. Ich würde es mit (\ D *) (\ d. *? \ D) (?: \ D + (\ d {2} | -))? (\ D *) $ verwenden, um die Währung und - für Cent zu erhalten. Sie können also auch Zeichenfolgen wie 1.000, - € analysieren. Die Währung wird in Teilen [1] oder Teil [4] angegeben und Teil [3] enthält Cent als Zahl oder -. Dann können Sie die Zeichenfolge wie gewünscht normalisieren.
CyberAleks

Das ist sehr schlimm und gefährlich, dies multipliziert Zahlen unter 10 mit 100. Ich habe es törichterweise verwendet, bevor ich alle Zahlen damit getestet habe :(
getestet

@sheavens danke für die Meldung. Entschuldigung, dass Sie das Problem so spät behoben haben, aber die neue Version funktioniert auch für diese Beträge.
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

Das ist meine Funktion. Funktioniert mit allen Währungen ..

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]/, "")
    );

}

Verwendung: toFloat("$1,100.00")odertoFloat("1,100.00$")


3

Sie können dies versuchen

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

Ausgabe ist: Rs. 39.00

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

0
    $ 150.00
    Fr. 150.00
     689.00

Ich habe auf über drei Währungssymbole getestet. Sie können dies auch für andere tun.

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

Über dem regulären Ausdruck wird alles entfernt, was keine Ziffer oder ein Punkt ist. Sie können die Zeichenfolge ohne Währungssymbol erhalten, aber im Fall von "Fr. 150.00", wenn Sie für die Ausgabe trösten, erhalten Sie den Preis als

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

    output will be like  priceFloat : .150.00

Das ist falsch, also überprüfen Sie den Index von "." Teilen Sie das dann auf und erhalten Sie das richtige Ergebnis.

    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

Diese Funktion sollte unabhängig von den Einstellungen für Gebietsschema und Währung funktionieren:

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('.');
}

Dies setzt voraus, dass Sie das Dezimalzeichen kennen (in meinem Fall wird das Gebietsschema über PHP festgelegt, also verstehe ich es mit <?php echo cms_function_to_get_decimal_point(); ?>).


0

Dies hat bei mir funktioniert und deckt die meisten Randfälle ab :)

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.