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.

Bobby Borszich
quelle

Antworten:

480

Entfernen Sie alle Nicht-Punkte / Ziffern:

var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));
CMS
quelle
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
23

Buchhaltung.js ist der richtige Weg. Ich habe es bei einem Projekt verwendet und hatte sehr gute Erfahrungen damit.

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

Sie finden es bei GitHub

Thomas Kremmel
quelle
6
Update: Diese Bibliothek hat 71 offene Ausgaben und wurde seit 5 Monaten nicht mehr bearbeitet, daher vertraue ich ihr nicht. github.com/openexchangerates/accounting.js/issues
Ryan
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;
Jamie
quelle
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.

Phill
quelle
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.

Vindicar
quelle
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
8

Dieses Beispiel läuft in Ordnung

var currency = "$123,456.00";
var number = Number(currency.replace(/[^0-9\.]+/g,""));
alert(number);

http://jsbin.com/ecAviVOV/2/edit

PaVen Nguyen
quelle
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;
}
Grenzenlose isa
quelle
3

Ich weiß, dass Sie eine Lösung für Ihre Frage gefunden haben. Ich wollte Ihnen nur empfehlen, sich das folgende umfangreichere jQuery-Plugin für internationale Zahlenformate anzusehen:

Internationaler Zahlenformatierer

IEnumerator
quelle
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$")

Bycoder
quelle
3

Sie können dies versuchen

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

Ólafur Waage
quelle
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
Rajesh Kumar Maurya
quelle
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);
    }
Jyotiranjan
quelle
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;
}
Santosh Bharadwaj
quelle
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;
} 
Vladislav Kostenko
quelle
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(); ?>).

Skippy le Grand Gourou
quelle
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
melalj
quelle