Bagaimana cara mengubah string menjadi float di JavaScript?

255

Saya mencoba mengurai dua nilai dari datagrid. Kolom adalah numerik, dan ketika mereka memiliki koma (mis. 554,20), saya tidak bisa mendapatkan angka setelah koma. Saya sudah mencoba parseIntdan parseFloat. Bagaimana saya bisa melakukan ini?

Kamil Kiełczewski
sumber
lihat juga: stackoverflow.com/questions/24318654
dreftymac

Jawaban:

371

Jika itu dimaksudkan sebagai nilai yang terpisah, coba ini:

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

Jika mereka dimaksudkan sebagai nilai tunggal (seperti dalam bahasa Prancis, di mana satu-setengah ditulis 0,5)

var value = parseFloat("554,20".replace(",", "."));
Jesse Rusak
sumber
6
Bagaimana dengan di mana Anda memiliki koma yang digunakan sebagai pemisah seribu? Misalnya 1234 ditulis sebagai 1.234
Chris B
6
Anda bisa menghapus koma, lalu menguraikannya. (mis. ganti dengan "")
Jesse Rusak
7
itu tidak terlalu aman, seperti sconto = parseFloat ("5,, 5" .replace (",", ".")); mengembalikan 5 yang memimpin untuk meyakini bahwa ini adalah angka yang valid, tetapi Anda kehilangan bagian .5 atau Anda dapat menganggapnya bukan angka yang valid
max4ever
1
@ max4ever Jika Anda khawatir tentang diam-diam menerima nomor yang tidak valid, Anda dapat menggunakan, +(string)bukan parseString(string)seperti yang disarankan oleh @Stev di bawah ini. Jadi, contoh pertama adalah v1 = +(values[0]); v2 = +(values[1]);.
Jesse Rusak
1
GAGAL, ​​bagaimana jika nomor saya 6.000.000. Ganti fungsi hanya ganti pemisah koma pertama
GusDeCooL
55

Pernahkah Anda mencoba melakukan ini? : p

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

+ (string) akan melemparkan string ke float.

Berguna!

Jadi untuk menyelesaikan masalah Anda, Anda dapat melakukan sesuatu seperti ini:

var floatValue = +(str.replace(/,/,'.'));
Stev
sumber
7
Saya sangat suka +(str)solusinya - parseFloatmengabaikan karakter yang tidak valid setelah nomor, +(str)mengembalikan NaNdalam kasus-kasus itu, itulah yang saya butuhkan.
Alex
34

Ganti koma dengan titik.

Ini hanya akan mengembalikan 554:

var value = parseFloat("554,20")

Ini akan mengembalikan 554.20:

var value = parseFloat("554.20")

Jadi pada akhirnya, Anda cukup menggunakan:

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

Jangan lupa bahwa parseInt()seharusnya hanya digunakan untuk mem-parsing bilangan bulat (tidak ada floating point). Dalam kasus Anda, ia hanya akan mengembalikan 554. Selain itu, memanggil parseInt () pada float tidak akan membulatkan angka: ia akan mengambil lantai (bilangan bulat terdekat terdekat).


Contoh luas untuk menjawab pertanyaan Pedro Ferreira dari komentar:

Jika bidang teks berisi ribuan titik pemisah seperti di dalamnya 1.234.567,99dapat dihilangkan sebelumnya dengan yang lain replace:

var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))
Wadih M.
sumber
Bagaimana tentang "." ribuan pemisah? Seperti 4.554.20, apa yang akan kembali ...?
Pedro Ferreira
16

Jika Anda memperluas objek String seperti ini ..

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

.. Anda bisa menjalankannya seperti ini

"554,20".float()
> 554.20

bekerja dengan dot juga

"554.20".float()
> 554.20

typeof "554,20".float()
> "number"
sobi3ch
sumber
10
Meskipun biasanya dianggap bentuk buruk untuk memodifikasi prototipe objek dasar. Bagaimana jika kerangka kerja lain juga mencoba melakukan itu tetapi fungsinya berbeda?
phreakhead
3

@GusDeCool atau orang lain mencoba untuk mengganti lebih dari satu pemisah ribuan, salah satu cara untuk melakukannya adalah regex global yang menggantikan: /foo/g. Ingatlah bahwa itu .adalah metacharacter, jadi Anda harus menghindarinya atau memasukkannya ke dalam tanda kurung ( \.atau [.]). Inilah satu opsi:

var str = '6.000.000';
str.replace(/[.]/g,",");
Nick Benes
sumber
1
ya, penggantian tanpa regex hanya menggantikan satu kemunculan karakter.
Aukhan
2

Anda dapat menggunakan fungsi ini. Ini akan mengganti koma dengan '' dan kemudian akan mem-parseFlaot nilai dan setelah itu lagi akan menyesuaikan koma dalam nilai.

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;
    }
Muhammad Bilal
sumber
0

Saya memiliki masalah yang sama kecuali saya tidak tahu sebelumnya apa yang merupakan pemisah ribuan dan pemisah desimal. Saya akhirnya menulis perpustakaan untuk melakukan ini. Jika Anda tertarik di sini adalah: https://github.com/GuillaumeLeclerc/number-parsing

DARK_DUCK
sumber
-1

Mencoba

let str ="554,20";
let float = +str.replace(',','.');
let int = str.split(',').map(x=>+x);

console.log({float,int});

Kamil Kiełczewski
sumber