2009-02-17 2 views
181

Ich habe ein Textfeld, das eine Währungszeichenfolge darin haben wird, die ich dann diese Zeichenfolge in ein Double konvertieren muss, um einige Operationen auf es auszuführen.Wie konvertiert man einen Währungsstring mit jQuery oder Javascript in einen Doppelklick?

"$ 1,100.00" -> 1.100,00

Diese alle Client-Seite erfolgen muss. Ich habe keine andere Wahl als die Währungszeichenfolge als Währungszeichenfolge als Eingabe zu belassen, muss sie aber in ein Double konvertieren/konvertieren, um einige mathematische Operationen zu ermöglichen.

Antwort

359

Entfernen Sie alle nicht dot/Ziffern:

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

scheint perfekt für mich zu konvertieren, danke –

+0

+1 (Sorry für den vorherigen Kommentar, die Tatsache, dass Sie tatsächlich waren * ausgeschlossen * der Punkt als auch nicht aus irgendeinem Grund zu mir gekommen.) – Tomalak

+3

Ein weiterer Grund, warum RegExp sein kann elegant. – OnesimusUnbound

3

Ich weiß, dass Sie eine Lösung auf Ihre Frage gefunden haben, wollte ich nur empfehlen, vielleicht schauen Sie auf die folgende umfangreichere jQuery-Plugin für internationale Zahlenformate:

International Number Formatter

3

Sie können versuchen, diese

<script type="text/javascript"> 

var str="$1,112.12"; 
str = str.replace(",",""); 
str = str.replace("$",""); 
document.write(parseFloat(str)); 

</script> 
+4

wird nicht funktionieren, nur das erste Komma wird ersetzt. – Lee

15

einen regulären Ausdruck über die Formatierung (Dollar und Komma), und verwendet parseFloat konvertieren die Zeichenfolge zu einer Gleitkomma number.`

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

Bemerkenswert ist, dass Sie Float nicht für andere Anwendungen als "Toy" verwenden sollten, wenn Sie eine Währung hinzufügen. Sie werden mit ** nicht ** genauen Summen enden. – Ally

+6

Sie werden überrascht und unglücklich sein, wenn parseFloat ("151.20" * 100) Ihnen 15119.999999999998 gibt, aber parseFloat ("151.40" * 100) gibt Ihnen 15140. Verwenden Sie parseFloat niemals für Geld. Verwenden Sie spezielle Bibliotheken für den Umgang mit Geld, wie zB accounting.js oder eines der anderen, die hier vorgeschlagen werden. – bambery

11

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

Mit jQuery Globalize können Sie ein kulturspezifisches Format für einen Float analysieren.

https://github.com/jquery/globalize

eine Zeichenfolge "$ 13,042.00" gegeben, und en-US gesetzt globalisieren:

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

Dies wird:

Globalize.culture("en-US"); 

Sie den Schwimmer Wert aus wie so analysieren kann Geben Sie:

13042.00 

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

+0

jetzt ist dies eine interessante Antwort, danke! – YangombiUmpakati

3

Ich weiß, dass dies eine alte Frage ist, aber die Antwort von CMS scheint einen kleinen kleinen Fehler zu haben: Es funktioniert nur, wenn das Währungsformat "." als Dezimaltrennzeichen. Zum Beispiel, wenn Sie mit russischen Rubeln arbeiten müssen, wird die Zeichenfolge wie folgt aussehen: "1 000,00 Rub."

Meine Lösung ist weit weniger elegant als CMS, aber es sollte den Trick tun.

var currency = "1 000,00 rub."; //it works for US-style currency strings as well 
var cur_re = /\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')); 

Annahmen:

  • Währungswert verwendet Dezimalschreibweise
  • gibt es keine Ziffern in der Zeichenfolge, die nicht Teil des Währungswertes
  • Währungswert, enthält entweder 0 oder 2-stellig in seinem Bruchteil *

Die Regexp kann sogar so etwas wie "1.999 Dollar und 9 9 Cent ", obwohl es kein beabsichtigtes Merkmal ist und es sollte nicht verlässlich sein.

Hoffe, das wird jemandem helfen.

+0

Danke. 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 Cents. So können Sie auch Saiten wie 1.000, - € analysieren. Die Währung wird in Teilen [1] oder Teil [4] sein und Teil [3] enthält Cents als Zahl oder -. Dann können Sie die Zeichenfolge normalisieren, wie Sie möchten. – CyberAleks

+0

Dies ist sehr schlecht und gefährlich, dies multipliziert Zahlen weniger als 10 mal 100. Ich nutzte es töricht, bevor ich alle Zahlen damit prüfte :( – sheavens

19

accounting.js ist der Weg zu gehen. Ich habe es bei einem Projekt benutzt und sehr gute Erfahrungen damit gemacht.

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

Sie es bei GitHub

+1

Update: Diese Bibliothek hat 71 offene Probleme und wurde nicht in 5 Monaten bearbeitet, also ich Ich vertraue ihm nicht https://github.com/openexchangerates/accounting.js/issues – Ryan

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

Ausgang ist ok laufen: Rs. 39,00

use jquery.glob.js, 
    jQuery.glob.all.js 
0
$ 150.00 
    Fr. 150.00 
    € 689.00 

I für über drei Währungssymbole getestet haben Sie können es auch für andere tun kann.

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

Above regulärer Ausdruck wird alles entfernen, das keine Ziffer oder ein period.So Sie ist die Zeichenfolge ohne Währungssymbol erhalten, aber im Fall von „Fr. 150.00“, wenn Sie für die Ausgabe der Konsole dann werden Sie Preis bekommen als

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

    output will be like priceFloat : .150.00 

was falsch ist, so überprüfen Sie den Index von "." dann teilen Sie das und erhalten Sie das richtige Ergebnis.

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

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

} 

Verbrauch: toFloat("$1,100.00") oder toFloat("1,100.00$")

2

// "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; 
} 
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; 
} 
Verwandte Themen