JavaScript dize float dönüştürmek nasıl?


Yanıtlar:


372

Ayrı değerler olması gerekiyorsa, şunu deneyin:

var values = "554,20".split(",")
var v1 = parseFloat(values[0])
var v2 = parseFloat(values[1])

Tek bir değer olması gerekiyorsa (yarısının 0,5 yazıldığı Fransızca gibi)

var value = parseFloat("554,20".replace(",", "."));

6
Bin ayırıcı olarak kullanılan virgülün nerede olduğu hakkında? Ör 1234, 1.234 olarak yazılmıştır
Chris B

6
Virgül kaldırıp ayrıştırabilirsiniz. (örn., "" ile değiştirin)
Jesse Rusak

7
sconto = parseFloat ("5, 5" .replace (",", ".")) gibi çok güvenli değil; geçerli bir sayı olduğuna inanmak için 5 tane önde döndürür, ancak .5 bölümünü kaybedersiniz ya da geçerli bir sayı olmadığını düşünebilirsiniz
max4ever 9

1
@ max4ever Geçersiz numaraları sessizce kabul etmekten endişe ediyorsanız, aşağıdaki @Stev tarafından önerilenin +(string)yerine kullanabilirsiniz parseString(string). Yani, ilk örnek olurdu v1 = +(values[0]); v2 = +(values[1]);.
Jesse Rusak

1
FAIL, ya numaram ise 6.000.000. Fonksiyon değiştirme sadece ilk virgül ayırıcıyı değiştir
GusDeCooL

55

Bunu hiç denedin mi? : p

var str = '3.8';ie
alert( +(str) + 0.2 );

+ (string) stringi float haline getirir.

Kullanışlı!

Yani probleminizi çözmek için böyle bir şey yapabilirsiniz:

var floatValue = +(str.replace(/,/,'.'));

7
+(str)Çözümü gerçekten seviyorum - parseFloatsayıdan sonra geçersiz karakterleri yok sayar , bu durumlarda +(str)geri döner NaN, tam da ihtiyacım olan şey budur.
Alex

34

Virgül ile bir nokta değiştirin.

Bu yalnızca 554 değerini döndürür:

var value = parseFloat("554,20")

Bu 554.20 döndürecektir:

var value = parseFloat("554.20")

Sonuçta, şunları kullanabilirsiniz:

var fValue = parseFloat(document.getElementById("textfield").value.replace(",","."))

Bunun parseInt()yalnızca tamsayıları ayrıştırmak için kullanılması gerektiğini unutmayın (kayan nokta yok). Sizin durumunuzda sadece 554 döndürür. Ayrıca, bir kayan nokta üzerinde parseInt () çağrılması sayıyı yuvarlamaz: zemini alır (en yakın düşük tamsayı).


Pedro Ferreira'un sorusuna yorumlardan cevap vermek için genişletilmiş örnek:

Metin alanı, 1.234.567,99bunlarda olduğu gibi binlerce ayırıcı nokta içeriyorsa, önceden başka bir ile ortadan kaldırılabilir replace:

var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))

Peki ya "." binlerce ayırıcı? 4.554,20 gibi ne dönecekti ...?
Pedro Ferreira

16

String nesnesini böyle genişletirseniz ..

String.prototype.float = function() { 
  return parseFloat(this.replace(',', '.')); 
}

.. böyle çalıştırabilirsin

"554,20".float()
> 554.20

nokta ile de çalışır

"554.20".float()
> 554.20

typeof "554,20".float()
> "number"

10
Her ne kadar temel nesne prototiplerini değiştirmek genellikle kötü form olarak kabul edilir. Başka bir çerçeve de bunu yapmaya çalıştıysa, ancak işlevsellik farklıysa?
phreakhead

3

@GusDeCool veya bunu yapmanın bir yolu birden fazla binlerce ayırıcılar değiştirmeye çalışırken başkasının küresel regex yerine geçerli: /foo/g. Bunun .bir metakarakter olduğunu unutmayın , bu yüzden kaçmanız veya parantez ( \.veya [.]) içine koymanız gerekir . İşte bir seçenek:

var str = '6.000.000';
str.replace(/[.]/g,",");

1
evet, normal ifade içermeyen bir yer değiştirme karakterin yalnızca bir örneğinin yerine geçer.
Aukhan

2

Bu işlevi kullanabilirsiniz. Virgüllerin yerini '' alır ve sonra değeri ayrıştırır ve bundan sonra virgül değerini tekrar ayarlar.

function convertToFloat(val) {
        if (val != '') {
            if (val.indexOf(',') !== -1)
                val.replace(',', '');
            val = parseFloat(val);
            while (/(\d+)(\d{3})/.test(val.toString())) {
                val = val.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2');
            }
        }
        return val;
    }


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.