Saya mencoba menulis aplikasi yang membantu Anda mengelola keuangan Anda. Saya menggunakan EditText
Bidang di mana pengguna dapat menentukan jumlah uang.
Aku mengatur inputType
untuk numberDecimal
yang bekerja dengan baik, kecuali bahwa ini memungkinkan orang untuk memasukkan nomor seperti 123.122
yang tidak sempurna untuk uang.
Adakah cara untuk membatasi jumlah karakter setelah koma desimal menjadi dua?
java
android
android-edittext
Konstantin Weitz
sumber
sumber
InputFilter
antarmuka, sepertinya melakukan apa yang saya inginkan developer.android.com/reference/android/text/method/… , tetapi metodefilter
yang harus saya terapkan agak membingungkan saya. Apakah seseorang sudah menulis Filter seperti itu dan tahu cara menggunakannya?Jawaban:
Cara yang lebih elegan adalah menggunakan ekspresi reguler (regex) sebagai berikut:
Untuk menggunakannya lakukan:
sumber
Solusi yang lebih sederhana tanpa menggunakan regex:
Menggunakan:
sumber
Implementasi ini
InputFilter
memecahkan masalah.sumber
Berikut adalah contoh InputFilter yang hanya memperbolehkan maksimal 4 digit sebelum koma desimal dan maksimal 1 digit setelah itu.
Nilai yang diizinkan teks edit: 555.2 , 555 , .2
Nilai yang blok edittext: 55555.2 , 055.2 , 555.42
sumber
Saya membuat beberapa perbaikan untuk solusi @Pinhassi. Ini menangani beberapa kasus:
1.Anda dapat memindahkan kursor ke mana saja
2. penanganan tanda minus
3. digit sebelum = 2 dan digit setelah = 4 dan Anda memasukkan 12.4545. Kemudian jika Anda ingin menghapus ".", Itu tidak akan mengizinkan.
sumber
android:inputType="number"
atauandroid:inputType="numberDecimal"
tidak mengizinkan untuk mengetik minus, iniandroid:digits="0123456789.-"
tidak membantuSaya tidak suka solusi lain dan saya membuatnya sendiri. Dengan solusi ini, Anda tidak boleh memasukkan lebih dari MAX_BEFORE_POINT digit sebelum titik dan desimal tidak boleh lebih dari MAX_DECIMAL.
Anda tidak bisa mengetik digit secara berlebihan, tidak ada efek lain! Sebagai tambahan jika Anda menulis "." itu mengetik "0"
Setel EditText dalam tata letak ke:
android: inputType = "numberDecimal"
Tambahkan Pendengar di onCreate Anda. Jika Anda ingin mengubah jumlah digit sebelum dan sesudah titik, edit panggilan ke PerfectDecimal (str, NUMBER_BEFORE_POINT, NUMBER_DECIMALS), di sini diatur ke 3 dan 2
Sertakan Fungsi ini:
Dan selesai!
sumber
Saya mencapai ini dengan bantuan
TextWatcher
dengan cara berikutSolusi ini tidak akan mengizinkan pengguna memasukkan lebih dari dua digit setelah koma desimal. Anda juga dapat memasukkan sejumlah digit sebelum titik desimal. Lihat blog ini http://v4all123.blogspot.com/2013/05/set-limit-for-fraction-in-decimal.html untuk menyetel filter untuk beberapa EditText. Saya harap ini akan membantu. Terima kasih.
sumber
count
dengan-1
. Maka hanya ini yang akan bekerja dengan benar.int count = -1;
listener
. Bagaimanapun, silakan lihat posting blog saya . Anda mungkin mendapat ide. Jika Anda tidak bisa, tolong beri tahu saya. Saya akan membantu Anda mengatasi masalah ini.InputFilter yang saya buat memungkinkan Anda untuk mengkonfigurasi jumlah digit sebelum dan sesudah tempat desimal. Selain itu, ini melarang nol di depan.
sumber
Persyaratannya adalah 2 digit setelah desimal. Seharusnya tidak ada batasan untuk angka sebelum koma desimal. Jadi, solusinya harus,
Dan gunakan sebagai,
Terima kasih kepada @Pinhassi atas inspirasinya.
sumber
Solusi saya sederhana dan berfungsi sempurna!
Pemakaian:
sumber
isValid()
konstruktor untuk menghindari pembuatan ulang pola pada setiapisValid()
panggilan.Coba gunakan NumberFormat.getCurrencyInstance () untuk memformat string Anda sebelum Anda memasukkannya ke dalam TextView.
Sesuatu seperti:
Sunting - Tidak ada inputType untuk mata uang yang dapat saya temukan di dokumen. Saya membayangkan ini karena ada beberapa mata uang yang tidak mengikuti aturan yang sama untuk tempat desimal, seperti Yen Jepang.
Seperti yang disebutkan LeffelMania, Anda dapat mengoreksi input pengguna dengan menggunakan kode di atas dengan
TextWatcher
yang disetel diEditText
.sumber
Solusi @Pinhassi sedikit ditingkatkan.
Bekerja dengan sangat baik. Ini memvalidasi string yang digabungkan.
sumber
Saya telah memodifikasi solusi di atas dan membuat yang berikut. Anda dapat mengatur jumlah digit sebelum dan sesudah koma desimal.
}
sumber
Apa yang dilakukan ini adalah ketika Anda keluar dari fase pengeditan, ini memformat bidang ke format yang benar. Pada saat itu hanya memiliki 2 karakter desimal. Saya rasa ini cara yang cukup mudah untuk melakukan ini.
sumber
Semua jawaban di sini cukup rumit. Saya mencoba membuatnya lebih sederhana. Lihat kode saya dan putuskan sendiri -
sumber
Saya sangat menyukai jawaban Pinhassi, tetapi perhatikan bahwa setelah pengguna memasukkan digit angka yang ditentukan setelah koma, Anda tidak dapat lagi memasukkan teks ke sisi kiri koma desimal. Masalahnya adalah solusinya hanya menguji teks sebelumnya yang telah dimasukkan, bukan teks saat ini yang dimasukkan. Jadi inilah solusi saya yang memasukkan karakter baru ke dalam teks asli untuk validasi.
Dan panggilan untuk menyetel filter editText
sumber
Saya meningkatkan solusi yang menggunakan regex oleh Pinhassi sehingga juga menangani kasus tepi dengan benar. Sebelum memeriksa apakah masukan sudah benar, pertama-tama string terakhir dibuat seperti yang dijelaskan oleh dokumen android.
Pemakaian:
sumber
Kelas Simple Helper ada di sini untuk mencegah pengguna memasukkan lebih dari 2 digit setelah desimal:
sumber
Saya telah mengubah jawaban №6 (oleh Favas Kv) karena di sana Anda dapat menempatkan poin di posisi pertama.
sumber
Seperti yang dikatakan orang lain, saya menambahkan kelas ini dalam proyek saya dan menyetel filter ke
EditText
saya inginkan.Filter disalin dari jawaban @ Pixel. Saya hanya menyatukan semuanya.
Sekarang atur filter
EditText
seperti ini.Di sini satu hal penting adalah itu memecahkan masalah saya karena tidak mengizinkan menampilkan lebih dari dua digit setelah titik desimal di dalamnya
EditText
tetapi masalahnya adalah ketika sayagetText()
dari ituEditText
, ia mengembalikan seluruh input yang saya ketikkan.Misalnya, setelah menerapkan filter di atas
EditText
, saya mencoba menyetel input 1.5699856987. Jadi di layar itu menunjukkan 1,56 yang sempurna.Kemudian saya ingin menggunakan input ini untuk beberapa kalkulasi lain, jadi saya ingin mendapatkan teks dari kolom input itu (
EditText
). Ketika saya memanggilnyamEditText.getText().toString()
mengembalikan 1,5699856987 yang tidak dapat diterima dalam kasus saya.Jadi saya harus mengurai nilainya lagi setelah mendapatkannya dari
EditText
.setScale
melakukan trik di sini setelah mendapatkan teks lengkap dariEditText
.sumber
Saya juga menemukan masalah ini. Saya ingin dapat menggunakan kembali kode tersebut di banyak EditTexts. Ini solusi saya:
Penggunaan:
Kelas:
sumber
@Meh untukmu ..
sumber
Tanggapan yang sangat terlambat: Kita bisa melakukannya seperti ini:
sumber
Berikut adalah
TextWatcher
yang hanya mengizinkan n jumlah digit setelah koma desimal.TextWatcher
Cara Penggunaan
sumber
Cara termudah untuk mencapainya adalah:
sumber
Inilah solusi saya:
Jika pengguna memasukkan angka dengan lebih dari dua angka setelah koma, itu akan dikoreksi secara otomatis.
Saya harap saya telah membantu!
sumber
Ini bekerja dengan baik untuk saya. Ini memungkinkan nilai untuk dimasukkan bahkan setelah fokus diubah dan diambil kembali. Sebagai contoh:
123.00
,12.12
,0.01
, dll ..1.
Integer.parseInt(getString(R.string.valuelength))
Menentukan panjang input yangdigits.Values
diakses daristring.xml
file. Sangat mudah untuk mengubah nilai. 2.Integer.parseInt(getString(R.string.valuedecimal))
, ini untuk batas maksimal tempat desimal.Array
EditText
nilai yang memungkinkan untuk melakukan tindakan.Saya baru saja menggunakan array nilai yang berisi beberapa
DecimalDigitsInputFilterNew.class
file edittext Next .sumber
Ini untuk membangun jawaban pinhassi - masalah yang saya temui adalah Anda tidak dapat menambahkan nilai sebelum desimal setelah batas desimal tercapai. Untuk memperbaiki masalah ini, kita perlu membuat string terakhir sebelum melakukan pencocokan pola.
sumber
sumber
source
setelahnyaet.getText()
. Itu selalu dipahami bahwa orang mengetik di akhir kotak, bukan di awal kotak.StringBuilder stringBuilder = new StringBuilder(text.getText().toString()); stringBuilder.replace(dstart, dend, source.toString()); String temp = stringBuilder.toString();
harus bekerja. Terima kasih.Buat kelas baru di Android kotlin dengan nama DecimalDigitsInputFilter
Panggil kelas ini dengan baris berikut
ada terlalu banyak jawaban untuk pertanyaan yang sama tetapi Anda dapat memasukkan 8 digit sebelum desimal dan 2 digit setelah desimal
jawaban lain hanya menerima 8 digit
sumber