Saya memiliki 2,299.00
sebagai string dan saya mencoba menguraikannya menjadi angka. Saya mencoba menggunakan parseFloat
, yang menghasilkan 2. Sepertinya masalahnya adalah koma, tetapi bagaimana saya akan menyelesaikan masalah ini dengan cara yang benar? Hapus saja koma?
var x = parseFloat("2,299.00")
alert(x);
javascript
number-formatting
pengguna1540714
sumber
sumber
.replace(/,/g, '')
Regex ini menggunakan globalg
untuk mengganti-semua.parseFloat("2,000,000.00".replace(',',''))
kembali2000
dan 2. gagal di banyak wilayah di dunia di mana,
tempat desimal, misalnyaparseFloat("2.000.000,00".replace(',',''))
kembali2
- lihat jawaban saya di bawah untuk sesuatu yang berfungsi di mana-mana di dunia.Menghapus koma berpotensi berbahaya karena, seperti yang disebutkan orang lain di komentar, banyak lokal menggunakan koma untuk mengartikan sesuatu yang berbeda (seperti tempat desimal).
Saya tidak tahu dari mana Anda mendapatkan string Anda, tetapi di beberapa tempat di dunia
"2,299.00"
=2.299
The
Intl
objek bisa menjadi cara yang baik untuk mengatasi masalah ini, tapi entah bagaimana mereka berhasil kapal spec dengan hanyaIntl.NumberFormat.format()
API dan tidak adaparse
rekan :(Satu-satunya cara untuk mengurai string dengan karakter numerik budaya di dalamnya menjadi nomor yang dapat dikenali mesin dengan cara apa pun yang i18n waras adalah dengan menggunakan pustaka yang memanfaatkan data CLDR untuk menutupi semua kemungkinan cara memformat string angka http: //cldr.unicode. org /
Dua opsi JS terbaik yang pernah saya temui sejauh ini:
sumber
Pada browser modern, Anda dapat menggunakan Intl.NumberFormat bawaan untuk mendeteksi format angka browser dan menormalkan masukan agar cocok.
Ruang mereka jelas untuk beberapa pengoptimalan dan penyimpanan dalam cache tetapi ini berfungsi dengan andal di semua bahasa.
sumber
Hapus apa pun yang bukan angka, koma desimal, atau tanda minus (
-
):Biola diperbarui
Perhatikan bahwa ini tidak akan berfungsi untuk angka dalam notasi ilmiah. Jika Anda ingin, mengubah
replace
jalur untuk menambahkane
,E
, dan+
untuk daftar karakter yang dapat diterima:sumber
str = str.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");
Inilah yang akan saya gunakan tetapi saya sama sekali tidak berguna di regex dan merupakan sesuatu yang saya temukan beberapa waktu lalu di beberapa utas SO lainnya.parseFloat
- yang akan memvalidasinya. :-)Biasanya Anda harus mempertimbangkan untuk menggunakan kolom input yang tidak mengizinkan input teks gratis untuk nilai numerik. Tetapi mungkin ada kasus, ketika Anda perlu menebak format input. Misalnya 1,234,56 di Jerman berarti 1,234,56 di AS. Lihat https://salesforce.stackexchange.com/a/21404 untuk daftar negara yang menggunakan koma sebagai desimal.
Saya menggunakan fungsi berikut untuk melakukan tebakan terbaik dan menghapus semua karakter non-numerik:
Coba di sini: https://plnkr.co/edit/9p5Y6H?p=preview
Contoh:
Fungsi ini memiliki satu titik lemah: Tidak mungkin menebak format jika Anda memiliki 1.123 atau 1.123 - karena bergantung pada format lokal, keduanya mungkin berupa koma atau pemisah ribuan. Dalam kasus khusus ini, fungsi akan memperlakukan pemisah sebagai pemisah ribuan dan mengembalikan 1123.
sumber
3,00 €
juga diganti menjadi 3,00. Sekadar catatan, yang3,001
diformat menjadi3001
. Untuk menghindari ini, masukan harus selalu dengan simbol desimal. Misalnya3,001.00€
3,001.00
mengkonversi dengan benar. Juga, tolong, perbarui jsfiddle.0,124
masih ada yang diubah menjadi 124Mengherankan bahwa mereka menyertakan toLocaleString tetapi bukan metode parse . Setidaknya toLocaleString tanpa argumen didukung dengan baik di IE6 +.
Untuk solusi i18n , saya datang dengan ini:
Pertama, deteksi pemisah desimal lokal pengguna:
Kemudian normalkan angkanya jika ada lebih dari satu pemisah desimal dalam String:
Terakhir, hapus apa pun yang bukan angka atau pemisah desimal:
sumber
Ini adalah pembungkus sederhana yang tidak mengganggu di sekitar
parseFloat
fungsi.sumber
Jika Anda ingin menghindari masalah yang diposting oleh David Meister dan Anda yakin tentang jumlah tempat desimalnya, Anda dapat mengganti semua titik dan koma dan membaginya dengan 100, mis .:
atau jika Anda memiliki 3 desimal
Terserah Anda jika ingin menggunakan parseInt, parseFloat atau Number. Juga Jika Anda ingin mempertahankan jumlah tempat desimal Anda dapat menggunakan fungsi .toFixed (...).
sumber
Semua jawaban ini gagal jika Anda memiliki angka dalam jutaan.
3.456.789 hanya akan mengembalikan 3456 dengan metode replace.
Jawaban paling benar hanya dengan menghilangkan koma adalah.
Atau hanya ditulis.
sumber
Ini mengubah angka di tempat apa pun menjadi angka normal. Berfungsi untuk poin desimal juga:
sumber
Dengan fungsi ini Anda akan dapat memformat nilai dalam berbagai format seperti
1.234,56
dan1,234.56
, dan bahkan dengan kesalahan seperti1.234.56
dan1,234,56
sumber
Jika Anda menginginkan jawaban l10n lakukan dengan cara ini. Contoh menggunakan mata uang, tetapi Anda tidak membutuhkannya. Library Intl perlu di-polyfill jika Anda harus mendukung browser lama.
sumber
replace()
hanya menggantikan pertandingan pertama saat tidak digunakanRegExp
dengan'g'
bendera.,
yang ada dalam pemisah koma di beberapa lokalGanti koma dengan string kosong:
sumber
Jika Anda memiliki sekumpulan kecil lokal untuk mendukung Anda mungkin akan lebih baik dengan hanya melakukan hardcode beberapa aturan sederhana:
sumber
sumber
Fungsi pemisahan membagi string menjadi larik menggunakan "," sebagai pemisah dan mengembalikan larik.
Fungsi gabungan menggabungkan elemen-elemen larik yang dikembalikan dari fungsi pemisahan.
Fungsi Number () mengubah string yang digabungkan menjadi angka.
sumber