Saya sedang membangun aplikasi web yang terutama untuk browser seluler. Saya menggunakan bidang input dengan tipe angka, jadi (kebanyakan) browser seluler hanya memanggil papan tombol angka untuk pengalaman pengguna yang lebih baik. Aplikasi web ini terutama digunakan di daerah di mana pemisah desimal koma, bukan titik, jadi saya perlu menangani kedua pemisah desimal.
Bagaimana cara menutupi seluruh kekacauan ini dengan titik dan koma?
Temuan saya:
Chrome Desktop
- Jenis input = angka
- Pengguna memasukkan "4,55" ke kolom input
$("#my_input").val();
mengembalikan "455"- Saya tidak bisa mendapatkan nilai yang benar dari input
Firefox Desktop
- Jenis input = angka
- Pengguna memasukkan "4,55" ke kolom input
$("#my_input").val();
mengembalikan "4,55"- Baiklah, saya bisa mengganti koma dengan titik dan mendapatkan float yang benar
Browser Android
- Jenis input = angka
- Pengguna memasukkan "4,55" ke kolom input
- Ketika input kehilangan fokus, nilai terpotong menjadi "4"
- Membingungkan bagi pengguna
Windows Phone 8
- Jenis input = angka
- Pengguna memasukkan "4,55" ke kolom input
$("#my_input").val();
mengembalikan "4,55"- Baiklah, saya bisa mengganti koma dengan titik dan mendapatkan float yang benar
Apa "praktik terbaik" dalam situasi seperti ini ketika pengguna dapat menggunakan koma atau titik sebagai pemisah desimal dan saya ingin mempertahankan tipe input html sebagai angka, untuk memberikan pengalaman pengguna yang lebih baik?
Dapatkah saya mengonversi koma ke titik "on the fly", mengikat acara utama, apakah itu berfungsi dengan input angka?
EDIT
Currenlty Saya tidak punya solusi, bagaimana mendapatkan nilai float (sebagai string atau angka) dari input yang jenisnya diatur ke angka. Jika pengguna akhir memasukkan "4,55", Chrome selalu kembali "455", Firefox mengembalikan "4,55" yang baik-baik saja.
Juga cukup menjengkelkan bahwa di Android (diuji emulator 4.2), ketika saya memasukkan "4,55" ke kolom input dan mengubah fokus ke tempat lain, nomor yang dimasukkan terpotong menjadi "4".
.val()
, dan Android melakukan sesuatu yang aneh. Bisakah Anda memeriksa apakah mereka berperilaku sama ketika Anda mengatur bahasa sistem ke sesuatu yang sesuai?var number = $(...).get(0).valueAsNumber;
if (isNaN(number)) number = parseFloat($(...).val().replace(',', '.');
Tapi solusi itu hanya berfungsi jika nomor yang dimasukkan hanya berisi 1 koma dan tidak ada titik tambahan ...Jawaban:
Saya pikir apa yang hilang dalam jawaban di atas adalah kebutuhan untuk menentukan nilai yang berbeda untuk
step
atribut, yang memiliki nilai default1
. Jika Anda ingin algoritma validasi input memungkinkan nilai floating-point, tentukan langkah yang sesuai.Misalnya, saya ingin jumlah dolar, jadi saya menetapkan langkah seperti ini:
Tidak ada yang salah dengan menggunakan jQuery untuk mengambil nilainya, tetapi Anda akan merasa berguna untuk menggunakan API DOM secara langsung untuk mendapatkan
validity.valid
properti elemen .Saya memiliki masalah yang sama dengan titik desimal, tetapi alasan saya menyadari ada masalah adalah karena gaya yang ditambahkan Twitter Bootstrap ke input angka dengan nilai yang tidak valid.
Berikut biola yang menunjukkan bahwa penambahan
step
atribut membuatnya berfungsi, dan juga menguji apakah nilai saat ini valid:TL; DR: Setel
step
atribut ke nilai titik-mengambang, karena itu default ke1
.CATATAN : Koma tidak memvalidasi untuk saya, tetapi saya menduga bahwa jika saya mengatur pengaturan bahasa / wilayah OS saya ke suatu tempat yang menggunakan koma sebagai pemisah desimal, itu akan berfungsi. * note in note *: itu tidak terjadi untuk pengaturan bahasa OS / keyboard * Jerman * di Ubuntu / Gnome 14.04.
sumber
step
atributnya"any"
alih-alih misalnya"0.01"
seperti yang ditunjukkan di sini. Lihat demo biola nathciketa versi tweak ini .<input type="number" step="any">
. Saya belum dapat menemukan cara untuk mematikan validasi HTML5. Saya dapat mematikan atau menyesuaikan pesan kesalahan, tetapi mengambil nilai dari input selalu merupakan omong kosong. Ada ide?This attribute applies when the value of the type attribute is text, search, tel, url, email, or password, otherwise it is ignored.
Jadi pola tidak berguna dengantype="number"
type
ketext
, jika tidak jawaban Anda tidak masuk akal.Menurut w3.org, atribut nilai dari input angka didefinisikan sebagai angka floating-point . Sintaks angka floating-point tampaknya hanya menerima titik sebagai pemisah desimal.
Saya telah mendaftarkan beberapa opsi di bawah ini yang mungkin bermanfaat bagi Anda:
1. Menggunakan atribut pola
Dengan atribut pattern, Anda dapat menentukan format yang diizinkan dengan ekspresi reguler dengan cara yang kompatibel dengan HTML5. Di sini Anda dapat menentukan bahwa karakter koma diizinkan dan pesan umpan balik yang bermanfaat jika polanya gagal.
Catatan: Dukungan lintas-browser sangat bervariasi. Mungkin lengkap, sebagian atau tidak ada ..
2. Validasi JavaScript
Anda dapat mencoba untuk mengikat panggilan balik sederhana untuk misalnya acara onchange (dan / atau blur ) yang akan menggantikan koma atau memvalidasi semua bersama-sama.
3. Nonaktifkan validasi browser ##
Ketiga, Anda bisa mencoba menggunakan atribut formnovalidate pada input angka dengan maksud menonaktifkan validasi browser untuk bidang itu secara bersamaan.
4. Kombinasi ..?
sumber
Apakah menggunakan koma atau titik untuk pemisah desimal sepenuhnya tergantung pada browser. Peramban membuat keputusan berdasarkan lokasi sistem operasi atau peramban, atau beberapa peramban mengambil petunjuk dari situs web. Saya membuat bagan perbandingan browser menunjukkan bagaimana dukungan browser yang berbeda menangani metode pelokalan yang berbeda. Safari menjadi satu-satunya browser yang menangani koma dan titik secara bergantian.
Pada dasarnya, Anda sebagai penulis web tidak dapat benar-benar mengendalikan ini. Beberapa solusi melibatkan penggunaan dua bidang input dengan bilangan bulat. Ini memungkinkan setiap pengguna untuk memasukkan data seperti yang Anda harapkan. Ini tidak terlalu seksi, tetapi itu akan bekerja di setiap kasus untuk semua pengguna.
sumber
Gunakan
valueAsNumber
sebagai ganti.val()
.sumber
NaN
.menggunakan jenis teks tetapi memaksa tampilan keyboard numerik
tag inputmode adalah solusinya
sumber
Saya belum menemukan solusi sempurna tetapi yang terbaik yang bisa saya lakukan adalah menggunakan type = "tel" dan menonaktifkan validasi HTML5 (formnovalidate):
Jika pengguna memasukkan koma, ia akan menampilkan koma di setiap browser modern yang saya coba (FF terbaru, IE, edge, opera, chrome, safari desktop, android chrome).
Masalah utamanya adalah:
Untuk kasus penggunaan saya, saya hanya perlu:
Jika Anda memiliki persyaratan serupa, ini harusnya cocok untuk Anda.
Catatan: Saya tidak suka dukungan atribut pola. Formnovalidate tampaknya bekerja lebih baik.
sumber
Ketika Anda memanggilnya
$("#my_input").val();
kembali sebagai variabel string. Jadi gunakanparseFloat
danparseInt
untuk konversi. Saat Anda menggunakanparseFloat
desktop atau ponsel, ITSELF memahami arti variabel.Dan ditambah Anda dapat mengkonversi float ke string dengan menggunakan
toFixed
argumen yang memiliki jumlah digit seperti di bawah ini:sumber
Browser tampaknya masih memiliki masalah (meskipun Chrome dan Firefox Nightly baik-baik saja). Saya memiliki pendekatan hacky untuk orang-orang yang benar-benar harus menggunakan bidang angka (mungkin karena panah kecil yang tidak dimiliki bidang teks).
Solusi saya
Saya menambahkan
keyup
event Handler ke form input dan melacak status dan mengatur nilainya begitu valid lagi.Cuplikan JS Murni JSFIDDLE
Tampilkan cuplikan kode
Cuplikan 9 Sudut
Tampilkan cuplikan kode
sumber
Rekomendasi saya? Jangan gunakan jQuery sama sekali. Saya memiliki masalah yang sama seperti Anda. Saya menemukan bahwa
$('#my_input').val()
selalu mengembalikan beberapa hasil yang aneh.Coba gunakan
document.getElementById('my_input').valueAsNumber
alih-alih$("#my_input").val();
lalu, gunakanNumber(your_value_retrieved)
untuk mencoba membuat Angka. Jika nilainya NaN, Anda tentu tahu bahwa itu bukan angka.Satu hal yang ditambahkan adalah ketika Anda menulis angka pada input, input sebenarnya akan menerima hampir semua karakter (saya dapat menulis tanda euro, dolar, dan semua karakter khusus lainnya), jadi yang terbaik adalah mengambil nilai menggunakan
.valueAsNumber
alih-alih menggunakan jQuery.Oh, dan BTW, yang memungkinkan pengguna Anda untuk menambahkan internasionalisasi (yaitu: mendukung koma alih-alih titik untuk membuat angka desimal). Biarkan saja
Number()
objek untuk membuat sesuatu untuk Anda dan itu akan menjadi desimal-aman, sehingga untuk berbicara.sumber
valueAsNumber
juga tidak bekerja secara konsisten di sepanjang browser.Kedengarannya Anda ingin menggunakan toLocaleString () pada input numerik Anda.
Lihat https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString untuk penggunaannya.
Pelokalan angka dalam JS juga tercakup dalam Internasionalisasi (Pemformatan angka "num.toLocaleString ()") tidak berfungsi untuk chrome
sumber
toLocaleString
tidak dapat diandalkan di seluruh platform.