Bir para birimi dize jQuery veya Javascript ile bir çift dönüştürmek nasıl?


237

Daha sonra üzerinde bazı işlemleri gerçekleştirmek için bu dize dönüştürmek için gereken bir para birimi dize olacak bir metin kutusu var .

"$1,100.00"1100.00

Bunun tüm istemci tarafında olması gerekir. Para birimi dizesini giriş olarak bir para birimi dize olarak bırakmak ama başka bir matematiksel işlemlere izin vermek için bir çift dönüştürmek gerekir.

Yanıtlar:


480

Nokta olmayan tüm rakamları / rakamları kaldır:

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

4
Görünüşe göre bu sadece bir .00takip olduğu yerde çalışıyor . Aksi takdirde "1100 $" ve "1100 $" gibi geçerli para birimi temsili. iki büyüklükte küçültülecektir.
Brian M. Hunt

19
Diğer yerel ayarların ondalık sayılar için ',' kullandığından bunun yerel ayara bağlı olduğunu unutmayın (örn. 1,100,00 €). Bazı diğer yerel ayarlar, grup başına farklı standart basamak sayısı kullanır (3 ondalık basamak gibi).
smola

8
Dizedeki negatif sayıları işlemek için, kabul edilecek karakter listesine bir '-' ekledim, yani .replace (/ [^ 0-9 - \.] + / G, "")
tonycoupland

4
Ayrıca, bazı muhasebe uygulamalarının negatif değerleri belirtmek için parantez içinde sayıları sardığını unutmayın. örneğin: (5.00 $) = - 5.00 $
Dave L

1
Ben burada cevap birkaç yıl geç olabilir biliyorum, ama aynı zamanda "para birimi = 0" dikkatli olmak gerekir. currency.replace öğesinin bir işlev olmadığını söyleyen bir javascript hatası alırsınız. Bundan kaçınmak için para = 0 ise basit bir kontrol ekledim.
Allen


20

Biçimlendirmeyi (dolar ve virgül) kaldırmak için bir normal ifade kullanın ve dizeyi kayan nokta numarasına dönüştürmek için parseFloat kullanın.

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

7
Para biriminizi eklerken 'Oyuncak' olmayan uygulamalar için şamandıra kullanmamalısınız. Sen ile sona erecek değil tam toplamları.
Ally

6
ParseFloat ("151.20" * 100) size 15119.999999999998 verdiğinde, ancak parseFloat ("151.40" * 100) size 15140 verdiğinde şaşıracak ve mutsuz olacaksınız. Para için hiç parseFloat kullanmayın. Para ile uğraşmak için, muhasebe.js veya burada önerilen diğer kitaplıklar gibi belirli kitaplıkları kullanın.
bambery

15

Bunun eski bir soru olduğunu biliyorum ama ek bir seçenek vermek istedim.

JQuery Globalize, bir kayan noktaya kültüre özgü bir formatı ayrıştırma yeteneği verir.

https://github.com/jquery/globalize

"$ 13,042.00" dizesi verildiğinde ve Globalize en-US olarak ayarlandı:

Globalize.culture("en-US");

Şamandıra değerini şu şekilde ayrıştırabilirsiniz:

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

Bu size:

13042.00

Ve diğer kültürlerle çalışmanıza izin verir.


10

Bunun eski bir soru olduğunu biliyorum, ancak CMS'nin cevabının küçük bir kusuru var gibi görünüyor: sadece para birimi biçimi "." ondalık ayırıcı olarak. Örneğin, Rus ruble ile çalışmanız gerekiyorsa, dize şöyle görünecektir: "1 000,00 ruble."

Çözümüm CMS'lerden çok daha az zarif, ama hile yapmalı.

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

Varsayımlar:

  • para birimi değeri ondalık gösterim kullanır
  • dizede para birimi değerinin bir parçası olmayan rakam yok
  • para birimi değeri kesirli kısmında 0 veya 2 basamak içeriyor *

Normal ifade, "1,999 dolar ve 99 sent" gibi bir şeyi bile ele alabilir, ancak amaçlanan bir özellik değildir ve buna güvenilmemelidir.

Umarım bu birine yardımcı olur.


Teşekkür ederim. En iyi cevap. Basit ve güçlü. Para birimi ve sent için - (\ D *) (\ d. *? \ D) (?: \ D + (\ d {2} | -))? (\ D *) $ ile kullanırım. Böylece 1.000, - € gibi dizeleri de ayrıştırabilirsiniz. Para birimi [1] veya [4] kısımlarında olacaktır ve [3] kısmı, sayı veya - olarak sent içerir. Daha sonra dizeyi istediğiniz gibi normalleştirebilirsiniz.
CyberAleks

Bu çok kötü ve tehlikelidir, bu sayı 10'dan az olan sayıları 100 ile çarpar. Tüm sayıları test etmeden önce aptalca kullandım :(
sheavens

@sheavens bildirdiğiniz için teşekkür ederiz. Çok geç düzeltmek için özür dileriz, ancak yeni sürüm aslında bu meblağlar için de çalışır.
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

Bu benim fonksiyonum. Tüm para birimlerinde çalışır ..

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

}

Kullanım: toFloat("$1,100.00")ortoFloat("1,100.00$")


3

Bunu deneyebilirsin

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

çıktı: Rs. 39.00

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

0
    $ 150.00
    Fr. 150.00
     689.00

Üç para birimi sembolünü test ettim. Diğerleri için de yapabilirsiniz.

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

Normal ifadenin üstünde, rakam veya nokta olmayan her şeyi kaldıracaktır. Yani para birimi simgesi olmadan dizeyi alabilirsiniz, ancak "Fr.150.00" durumunda çıktı için konsol yaparsanız, fiyatı şu şekilde alırsınız:

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

    output will be like  priceFloat : .150.00

yanlış olan "." sonra bunu bölün ve doğru sonucu alın.

    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

Bu işlev, yerel ayar ve para birimi ayarlarından bağımsız olarak çalışmalıdır:

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

Bu ondalık nokta karakterini bildiğinizi varsayar (benim durumumda yerel ayar PHP'den ayarlanmıştır, bu yüzden onu alıyorum <?php echo cms_function_to_get_decimal_point(); ?>).


0

Bu benim için çalıştı ve çoğu kenar durumu kapsar :)

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.