Saya perlu memiliki TextInput
komponen React Native yang hanya memungkinkan karakter numerik (0 - 9) untuk dimasukkan. Saya bisa mengatur keyboardType
untuk numeric
yang hampir membuat saya ada untuk input kecuali untuk periode (.). Namun ini tidak berhenti menempelkan karakter non-numerik ke dalam bidang.
Apa yang saya dapatkan sejauh ini adalah menggunakan OnChangeText
acara tersebut untuk melihat teks yang dimasukkan. Saya menghapus karakter non-numerik dari teks. Kemudian letakkan teks di bidang negara bagian. Kemudian perbarui TextInput
melalui Value
properti itu. Cuplikan kode di bawah ini.
<TextInput
style={styles.textInput}
keyboardType = 'numeric'
onChangeText = {(text)=> this.onChanged(text)}
value = {this.state.myNumber}
/>
onTextChanged(text) {
// code to remove non-numeric characters from text
this.setState({myNumber: text})
}
Ini sepertinya berhasil tetapi sepertinya hack. Apakah ada cara lain untuk melakukan ini?
react-native
Terry
sumber
sumber
keyboardType='numeric'
prop di TextInput untuk hanya menampilkan Numeric Keyboard (duh) dan juga mengganti teks dengan regextext.replace(/[^0-9]/g, '')
seperti yang disarankan di bawah ini untuk mencegah siapa pun menempelkan string di dalam TextInput. Sejauh ini berfungsi dengan baik di React Native v0.62Jawaban:
Itu adalah cara yang benar untuk melakukannya hingga komponen seperti itu (atau atribut pada TextInput) dikembangkan secara khusus.
Web memiliki tipe 'angka' untuk elemen masukan, tetapi yang berbasis web dan react-native tidak menggunakan tampilan web.
Anda dapat mempertimbangkan untuk membuat input itu sebagai komponen react sendiri (mungkin memanggil NumberInput): yang akan memungkinkan Anda untuk menggunakannya kembali atau bahkan mungkin open source karena Anda dapat membuat banyak TextInputs yang memiliki filter / pemeriksa nilai yang berbeda.
Kelemahan dari koreksi langsung adalah memastikan umpan balik yang benar diberikan kepada pengguna untuk mencegah kebingungan tentang apa yang terjadi pada nilainya
sumber
Menggunakan RegExp untuk mengganti bukan digit lebih cepat daripada menggunakan perulangan for dengan daftar putih, seperti yang dilakukan jawaban lain.
Gunakan ini untuk penangan onTextChange Anda:
Uji kinerja di sini: https://jsperf.com/removing-non-digit-characters-from-a-string
sumber
text.replace(/[^A-Za-z]/g, '')
keyboardType='numeric'
prop ke bidang TextInput.Anda bisa melakukannya seperti ini. Ini hanya akan menerima nilai numerik, dan membatasi hingga 10 angka sesuai keinginan Anda.
Anda dapat melihat nilai yang dimasukkan dengan menulis kode berikut di halaman Anda:
Dalam fungsi onChanged (), kodenya terlihat seperti ini:
Saya harap ini bermanfaat bagi orang lain.
sumber
React Native TextInput menyediakan alat peraga keyboardType dengan kemungkinan nilai berikut: default nomor-pad desimal-pad numerik alamat email-pad telepon
jadi untuk kasus Anda, Anda dapat menggunakan keyboardType = 'number-pad' untuk hanya menerima angka. Ini tidak termasuk '.'
begitu,
adalah apa yang harus Anda gunakan dalam kasus Anda.
untuk lebih jelasnya silakan lihat tautan dokumen resmi untuk TextInput: https://facebook.github.io/react-native/docs/textinput#keyboardtype
sumber
Fungsi untuk memvalidasi masukan:
Semoga bermanfaat.
sumber
Hanya izinkan angka menggunakan ekspresi reguler
Anda mungkin ingin memiliki lebih dari satu validasi
sumber
validations(value: string) { return /0/.test(value) && /^\d+$/.test(value) ? this.setState({ numColumns: value }) : false; }
Solusi Pertama
Anda dapat menggunakan
keyboardType = 'numeric'
untuk keyboard numerik.Dalam kasus pertama, tanda baca disertakan, misalnya: - . dan -
Solusi Kedua
Gunakan ekspresi reguler untuk menghapus tanda baca.
Silakan periksa tautan makanan ringan
https://snack.expo.io/@vishal7008/numeric-keyboard
sumber
Pengingat bagi mereka yang mengalami masalah bahwa "onChangeText" tidak dapat mengubah nilai TextInput seperti yang diharapkan di iOS: itu sebenarnya adalah bug di ReactNative dan telah diperbaiki di versi 0.57.1. Lihat: https://github.com/facebook/react-native/issues/18874
sumber
dan metode onChanged:
sumber
"This synthetic event is reused for performance reasons. If you're seeing this, you're accessing the property 'type' on a released/nullified synthetic event. This is set to null. If you must keep the original synthetic event around, use event.persist(). See fb>react-event-pooling for more information."
Saya tidak tahu harus berbuat apa dengan ini. Bisakah kamu menolong?Saya memiliki masalah yang sama di iOS, menggunakan acara onChangeText untuk memperbarui nilai teks yang diketik oleh pengguna. Saya tidak dapat memperbarui nilai TextInput, jadi pengguna masih akan melihat karakter non numerik yang diketiknya.
Ini karena, ketika karakter non numerik ditekan, status tidak akan berubah karena this.setState akan menggunakan angka yang sama (angka yang tersisa setelah menghapus karakter non numerik) dan kemudian TextInput tidak akan dirender ulang.
Satu-satunya cara yang saya temukan untuk menyelesaikan ini adalah dengan menggunakan acara keyPress yang terjadi sebelum acara onChangeText, dan di dalamnya, gunakan setState untuk mengubah nilai status ke yang lain, sama sekali berbeda, memaksa render ulang saat acara onChangeText dipanggil . Tidak terlalu senang dengan ini tetapi berhasil.
sumber
sumber
Saya menulis fungsi ini yang menurut saya berguna untuk mencegah pengguna memasukkan apa pun selain yang ingin saya terima. Saya juga menggunakan
keyboardType="decimal-pad"
dan milik sayaonChangeText={this.decimalTextChange}
if
Blok pertama adalah penanganan error jika pengguna menghapus semua teks, atau menggunakan titik desimal sebagai karakter pertama, atau jika mereka mencoba memasukkan lebih dari satu tempat desimal,if
blok kedua memastikan mereka dapat mengetik sebagai banyak angka yang mereka inginkan sebelum tempat desimal, tetapi hanya maksimal dua tempat desimal setelah titik.sumber
Menggunakan RegExp untuk mengganti non digit. Berhati-hatilah kode berikutnya akan memberi Anda digit pertama yang dia temukan, jadi jika pengguna menempelkan paragraf dengan lebih dari satu angka (xx.xx) kode akan memberi Anda angka pertama. Ini akan membantu jika Anda menginginkan sesuatu seperti harga, bukan ponsel.
Gunakan ini untuk penangan onTextChange Anda:
sumber
Anda dapat menghapus karakter non numerik menggunakan regex
sumber
const [text, setText] = useState(''); const onChangeText = (text) => { if (+text) { setText(text); } }; <TextInput keyboardType="numeric" value={text} onChangeText={onChangeText} />
Ini harus menghemat dari keyboard fisik
sumber
Ini tidak berfungsi di IOS, setState -> render -> tidak mengubah teks, tetapi dapat mengubah lainnya. Textinput tidak dapat mengubah nilainya sendiri saat textOnChange.
Omong-omong, ini berfungsi dengan baik di Android.
sumber
Saya telah membuat komponen yang memecahkan masalah ini:
https://github.com/amirfl/react-native-num-textinput
sumber
Berikut adalah jawaban sederhana saya yang lain untuk hanya menerima angka di kotak teks menggunakan Regular Expressions.
sumber
Untuk angka Desimal / Floating point hanya coba ini
}
sumber
Nah, ini adalah cara yang sangat sederhana untuk memvalidasi angka yang berbeda dengan 0.
Ini akan menjadi NaN jika inputNum bukan angka atau salah jika 0
sumber