Keluarkan semua karakter non-numerik dari string dalam JavaScript

701

Pertimbangkan skenario non-DOM di mana Anda ingin menghapus semua karakter non-numerik dari string menggunakan JavaScript / ECMAScript. Setiap karakter yang berada dalam jangkauan 0 - 9harus disimpan.

var myString = 'abc123.8<blah>';

//desired output is 1238

Bagaimana Anda mencapai ini dalam JavaScript biasa? Harap ingat ini adalah skenario non-DOM, jadi jQuery dan solusi lain yang melibatkan browser dan acara menekan tombol tidak cocok.

p.campbell
sumber

Jawaban:

1431

Gunakan metode string .replacedengan regex of \D, yang merupakan kelas karakter steno yang cocok dengan semua non-digit:

myString = myString.replace(/\D/g,'');
csj
sumber
5
Terima kasih csj; di mana saja untuk mencari info lebih lanjut \D?
p.campbell
34
Ini adalah referensi regex default saya: regular-expressions.info/reference.html Kelas karakter bawaan masing-masing memiliki pelengkap bawaan . \ d \ D (digit versus segalanya kecuali digit) \ w \ W (karakter karakter versus segalanya kecuali karakter kata) \ s \ S (spasi putih versus semuanya kecuali spasi putih)
csj
3
Untuk lebih jelasnya, ini adalah sintaks untuk ganti: w3schools.com/jsref/jsref_obj_regexp.asp karena garis miring ke depan dan "g" adalah bagian dari perintah itu, bukan bagian dari RegEx.
Mike K
tidak replacebekerja dengan sintaks yang tepat ini di semua browser? Sepertinya saya ingat mendapatkan object has no method 'replace' versi IE yang lebih lama ketika menggunakan ini dengan teks yang saya ambil dengan jQuery ... atau sesuatu seperti itu.
cwd
@ cwd Saya tidak tahu apa yang didukung di browser masa lalu atau saat ini. Pertanyaannya menentukan konteks non-DOM, sehingga kemungkinan poster tersebut dibuat skrip dalam lingkungan bukan browser web.
csj
354

Jika Anda perlu ini untuk meninggalkan titik untuk angka float, gunakan ini

var s = "-12345.50 €".replace(/[^\d.-]/g, ''); // gives "-12345.50"
maksimal4ever
sumber
6
Adakah pakar regexp? Cara membuatnya hanya memungkinkan satu titik (sangat relevan dengan angka). Terima kasih!
Kasperi
1
apa maksudmu? beri contoh input dan output
max4ever
2
Tidak bagus: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9.Harus menghapus String yang mungkin mengelilingi Nomor ..
vsync
2
@ max4ever, Anda menyelamatkan hidup saya, terima kasih telah menangani -case number (negatif) :)
Pankaj Parkar
4
@Kasperi mungkin:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
A. Genedy
50

Gunakan ekspresi reguler, jika implementasi skrip Anda mendukungnya. Sesuatu seperti:

myString.replace(/[^0-9]/g, '');
Auraseer
sumber
12
Untuk beberapa alasan cara ini tampaknya jauh lebih mudah dibaca daripada [^ \ d].
Arman Bimatov
1
whats the g untuk setelah pembatas regex ??
Native Coder
3
@NativeCoder stackoverflow.com/questions/12993629/…
RagnaRock
23

Anda dapat menggunakan RegExp untuk mengganti semua karakter non-digit:

var myString = 'abc123.8<blah>';
myString = myString.replace(/[^\d]/g, ''); // 1238
CMS
sumber
22

Sesuatu di sepanjang garis:

yourString = yourString.replace ( /[^0-9]/g, '' );
Jan Hančič
sumber
10
Bukan jawaban yang tepat untuk pertanyaan asli, tetapi versi untuk menangani titik desimal:yourString = yourString.replace ( /[^0-9.]/g, '' );
Maxim Mai
0

mencoba

myString.match(/\d/g).join``

Kamil Kiełczewski
sumber
0

Di Angular / Ionic / VueJS - Saya baru saja menemukan metode sederhana:

stripNaN(txt: any) {
    return txt.toString().replace(/[^a-zA-Z0-9]/g, "");
}

Penggunaan pada tampilan:

<a [href]="'tel:'+stripNaN(single.meta['phone'])" [innerHTML]="stripNaN(single.meta['phone'])"></a>
Hibah
sumber
0

Sayangnya tidak ada jawaban di atas yang berfungsi untuk saya.

Saya ingin mengonversi angka mata uang dari string seperti $123,232,122.11(1232332122.11) atau USD 123,122.892(123122.892) atau mata uang seperti ₹ 98,79,112.50(9879112.5) untuk memberi saya output angka termasuk penunjuk desimal.

Harus membuat regex saya sendiri yang terlihat seperti ini:

str = str.match(/\d|\./g).join('');
Legiun Kekacauan
sumber
0

Fungsi pendek untuk menghapus semua karakter non-numerik tetapi mempertahankan desimal (dan mengembalikan nomor):

parseNum = str => +str.replace(/[^.\d]/g, '');
let str = 'a1b2c.d3e';
console.log(parseNum(str));

jackosaur
sumber
-5

kami berada di 2017 sekarang Anda juga dapat menggunakan ES2016

var a = 'abc123.8<blah>';
console.log([...a].filter( e => isFinite(e)).join(''));

atau

console.log([...'abc123.8<blah>'].filter( e => isFinite(e)).join(''));  

Hasilnya adalah

1238
Frank Wisniewski
sumber
12
Ini adalah cara yang sangat tidak efisien untuk melakukan operasi ini.
djheru
apa yang tidak efisien atau buruk di sini?
Vladislav Kostenko
5
Ini mengubah string menjadi array string karakter tunggal melalui metode cadangan, dan kemudian menerapkan fungsi filter atas JavaScript pada setiap item array, mengembalikan array string baru, untuk akhirnya bergabung dengan array yang kembali menjadi string. Regex mengambil string dan mengembalikan string dan pemrosesan dilakukan melalui kode asli.
ShortFuse