Bir datagrid iki değer ayrıştırmaya çalışıyorum. Alanlar sayısaldır ve virgül kullandıklarında (ör. 554,20), virgülden sonraki sayıları alamıyorum. Denedim parseIntve parseFloat. Bunu nasıl yapabilirim?
Bir datagrid iki değer ayrıştırmaya çalışıyorum. Alanlar sayısaldır ve virgül kullandıklarında (ör. 554,20), virgülden sonraki sayıları alamıyorum. Denedim parseIntve parseFloat. Bunu nasıl yapabilirim?
Yanıtlar:
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(",", "."));
+(string)yerine kullanabilirsiniz parseString(string). Yani, ilk örnek olurdu v1 = +(values[0]); v2 = +(values[1]);.
6.000.000. Fonksiyon değiştirme sadece ilk virgül ayırıcıyı değiştir
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(/,/,'.'));
+(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.
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(",","."))
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"
@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,",");
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;
}
Binlerce ayırıcı ve ondalık ayırıcı ne olduğunu önceden bilmiyordum dışında aynı sorun vardı. Bunu yapmak için bir kütüphane yazdım. Eğer ilgileniyorsanız burada: https://github.com/GuillaumeLeclerc/number-parsing
Deneyin
let str ="554,20";
let float = +str.replace(',','.');
let int = str.split(',').map(x=>+x);
console.log({float,int});