Próbuję napisać aplikację, która pomoże Ci zarządzać swoimi finansami. Używam EditText
pola, w którym użytkownik może określić kwotę pieniędzy.
I ustawić inputType
na numberDecimal
który działa dobrze, oprócz tego, że pozwala to ludzie, aby wprowadzić numery takie jak 123.122
który nie jest idealne dla pieniędzy.
Czy istnieje sposób ograniczenia liczby znaków po przecinku do dwóch?
java
android
android-edittext
Konstantin Weitz
źródło
źródło
InputFilter
interfejs, wygląda na to, że robi to, co chcę developer.android.com/reference/android/text/method/… , ale metodafilter
, którą muszę zaimplementować, jest dla mnie dość zagmatwana. Czy ktoś już napisał taki filtr i wie, jak go używać?Odpowiedzi:
Bardziej eleganckim sposobem byłoby użycie wyrażenia regularnego (regex) w następujący sposób:
Aby go użyć, wykonaj:
źródło
Prostsze rozwiązanie bez użycia wyrażenia regularnego:
Używać:
źródło
Ta implementacja
InputFilter
rozwiązuje problem.źródło
Oto przykład InputFilter który dopuszcza maksymalnie 4 cyfry przed kropką dziesiętną i maksymalnie 1 cyfrę po tym.
Wartości, na które pozwala edittext : 555,2 , 555 , .2
Wartości blokowane przez edittext: 55555.2 , 055.2 , 555.42
źródło
Zrobiłem kilka poprawek dla rozwiązania @Pinhassi. Obsługuje niektóre przypadki:
1. możesz przesuwać kursor w dowolnym miejscu
2. obsługa znaku minus
3.digitsbefore = 2 i digitsafter = 4 i wpisz 12.4545. Jeśli chcesz usunąć „.”, Nie pozwoli.
źródło
android:inputType="number"
lubandroid:inputType="numberDecimal"
nie pozwolisz na wpisanie minus, toandroid:digits="0123456789.-"
nie pomożeNie podoba mi się drugie rozwiązanie i stworzyłem własne. W przypadku tego rozwiązania nie można wprowadzić więcej niż MAX_BEFORE_POINT cyfry przed kropką, a liczba miejsc po przecinku nie może być większa niż MAX_DECIMAL.
Po prostu nie możesz wpisać nadmiaru cyfry, żadnych innych efektów! Dodatkowo, jeśli napiszesz „.” wpisuje „0”
Ustaw EditText w układzie na:
android: inputType = "numberDecimal"
Dodaj Listener w swoim onCreate. Jeśli chcesz zmodyfikować liczbę cyfr przed i po punkcie, edytuj wywołanie PerfectDecimal (str, NUMBER_BEFORE_POINT, NUMBER_DECIMALS), tutaj jest ustawiony na 3 i 2
Uwzględnij tę funkcję:
Gotowe!
źródło
Osiągnąłem to z pomocą
TextWatcher
w następujący sposóbTo rozwiązanie nie pozwoli użytkownikowi na wprowadzenie więcej niż dwóch cyfr po przecinku. Możesz także wprowadzić dowolną liczbę cyfr przed kropką dziesiętną. Zobacz ten blog http://v4all123.blogspot.com/2013/05/set-limit-for-fraction-in-decimal.html, aby ustawić filtr dla wielu EditText. Mam nadzieję, że to pomoże. Dziękuję Ci.
źródło
count
z-1
. Wtedy tylko to będzie działać poprawnie.int count = -1;
listener
. W każdym razie spójrz na mój wpis na blogu . Możesz mieć pomysł. Jeśli nie możesz, daj mi znać. Pomogę Ci w tej sprawie.InputFilter, który wymyśliłem, pozwala skonfigurować liczbę cyfr przed i po miejscu dziesiętnym. Dodatkowo nie zezwala na zera wiodące.
źródło
Wymagane są 2 cyfry po przecinku. Nie powinno być ograniczeń co do cyfr przed przecinkiem. Tak więc rozwiązaniem powinno być:
I używaj go jako
Dzięki @Pinhassi za inspirację.
źródło
Moje rozwiązanie jest proste i działa idealnie!
Stosowanie:
źródło
isValid()
do konstruktora, aby uniknąć ponownego tworzenia wzorców w każdymisValid()
wywołaniu.Spróbuj użyć NumberFormat.getCurrencyInstance (), aby sformatować ciąg przed umieszczeniem go w TextView.
Coś jak:
Edycja - nie ma inputType dla waluty, którą mogłem znaleźć w dokumentacji. Wyobrażam sobie, że dzieje się tak, ponieważ istnieją waluty, w których nie obowiązują te same zasady dotyczące miejsc po przecinku, takie jak japoński jen.
Jak wspomniała LeffelMania, możesz poprawić dane wprowadzone przez użytkownika, używając powyższego kodu z
TextWatcher
ustawionym naEditText
.źródło
Nieco ulepszone rozwiązanie @Pinhassi.
Działa bardzo dobrze. Sprawdza poprawność połączonych ciągów.
źródło
Zmodyfikowałem powyższe rozwiązania i stworzyłem kolejne. Możesz ustawić liczbę cyfr przed i po przecinku.
}
źródło
Po wyjściu z fazy edycji formatuje pole do odpowiedniego formatu. W tej chwili ma tylko 2 znaki dziesiętne. Myślę, że jest to dość łatwy sposób na zrobienie tego.
źródło
Wszystkie odpowiedzi tutaj są dość złożone Starałem się to uprościć Spójrz na mój kod i sam zdecyduj -
źródło
Bardzo podobała mi się odpowiedź Pinhassiego, ale zauważyłem, że po wpisaniu przez użytkownika określonych cyfr po przecinku nie można już wprowadzać tekstu po lewej stronie przecinka. Problem polegał na tym, że rozwiązanie testowało tylko poprzednio wprowadzony tekst, a nie aktualnie wprowadzany. Oto moje rozwiązanie, które wstawia nowy znak do oryginalnego tekstu w celu weryfikacji.
I wezwanie do ustawienia filtra editText
źródło
Poprawiłem rozwiązanie, które używa wyrażenia regularnego Pinhassi, więc poprawnie obsługuje również przypadki brzegowe. Przed sprawdzeniem, czy dane wejściowe są poprawne, najpierw konstruowany jest końcowy ciąg, zgodnie z opisem w dokumentacji systemu Android.
Stosowanie:
źródło
Klasa Simple Helper zapobiega wpisywaniu przez użytkownika więcej niż 2 cyfr po przecinku:
źródło
Zmieniłem odpowiedź nr 6 (autorstwa Favas Kv), ponieważ tam możesz umieścić tylko punkt na pierwszej pozycji.
źródło
Jak powiedzieli inni, dodałem tę klasę do mojego projektu i ustawiłem filtr na
EditText
chcę.Filtr jest kopiowany z odpowiedzi @ Pixel. Po prostu składam to wszystko razem.
Teraz ustaw filtr w
EditText
ten sposób.Tutaj jedna ważna rzecz polega na tym, że rozwiązuje mój problem polegający na tym, że nie pozwala na wyświetlanie więcej niż dwóch cyfr po przecinku,
EditText
ale problem polegagetText()
na tymEditText
, że kiedy z tego zwracam cały wpis, który wpisałem.Np. Po nałożeniu filtra na
EditText
, próbowałem ustawić wejście 1.5699856987. Więc na ekranie pokazuje 1.56, co jest idealne.Następnie chciałem użyć tych danych wejściowych do innych obliczeń, więc chciałem uzyskać tekst z tego pola wejściowego (
EditText
). Kiedy zadzwoniłemmEditText.getText().toString()
, zwraca 1,5699856987, co w moim przypadku było nie do przyjęcia.Musiałem więc ponownie przeanalizować wartość po pobraniu jej z pliku
EditText
.setScale
rozwiązuje problem po pobraniu pełnego tekstu z plikuEditText
.źródło
Ja też natknąłem się na ten problem. Chciałem móc ponownie wykorzystać kod w wielu EditTexts. To jest moje rozwiązanie:
Stosowanie :
Klasa:
źródło
@Meh dla u ..
źródło
Bardzo późna odpowiedź: możemy to zrobić w ten sposób:
źródło
Tutaj jest
TextWatcher
dozwolone tylko n liczby cyfr po przecinku.TextWatcher
Jak używać
źródło
Najprostszym sposobem na osiągnięcie tego jest:
źródło
Oto moje rozwiązanie:
Jeśli użytkownik wprowadzi liczbę zawierającą więcej niż dwie liczby po przecinku, zostanie ona automatycznie poprawiona.
Mam nadzieję, że pomogłem!
źródło
U mnie to działa dobrze. Umożliwia wprowadzenie wartości nawet po zmianie i przywróceniu fokusa. Na przykład:
123.00
,12.12
,0.01
, itd ..1.
Integer.parseInt(getString(R.string.valuelength))
Określa długość danych wejściowych, do którychdigits.Values
można uzyskać dostęp zstring.xml
pliku. Zmiana wartości jest cicha. 2.Integer.parseInt(getString(R.string.valuedecimal))
, dotyczy to maksymalnego limitu miejsc dziesiętnych.Tablica
EditText
wartości umożliwiająca wykonanie akcji.Właśnie użyłem tablicy wartości, które zawierają wiele
DecimalDigitsInputFilterNew.class
plików edittext Next .źródło
Ma to na celu rozwinięcie odpowiedzi Pinhassi - problem, na który natknąłem się, polegał na tym, że nie można było dodawać wartości przed miejscami dziesiętnymi po osiągnięciu limitu dziesiętnego. Aby rozwiązać ten problem, musimy skonstruować końcowy ciąg przed dopasowaniem wzorca.
źródło
źródło
source
poet.getText()
. Zawsze rozumie, że ludzie piszą na końcu pola zamiast na początku pola.StringBuilder stringBuilder = new StringBuilder(text.getText().toString()); stringBuilder.replace(dstart, dend, source.toString()); String temp = stringBuilder.toString();
powinno działać. W każdym razie dzięki.Utwórz nową klasę w systemie Android Kotlin o nazwie DecimalDigitsInputFilter
Nazwij tę klasę następującym wierszem
jest zbyt wiele odpowiedzi na to samo, ale pozwoli ci to wprowadzić 8 cyfr przed przecinkiem i 2 cyfry po przecinku
inne odpowiedzi przyjmują tylko 8 cyfr
źródło