J'essaie d'écrire une application qui vous aide à gérer vos finances. J'utilise un EditText
champ dans lequel l'utilisateur peut spécifier un montant d'argent.
J'ai réglé le inputType
sur numberDecimal
qui fonctionne bien, sauf que cela permet aux gens d'entrer des nombres tels que 123.122
qui n'est pas parfait pour l'argent.
Existe-t-il un moyen de limiter à deux le nombre de caractères après la virgule décimale?
java
android
android-edittext
Konstantin Weitz
la source
la source
InputFilter
interface, elle semble faire ce que je veux developer.android.com/reference/android/text/method/… , mais la méthodefilter
que je dois mettre en œuvre me déroute assez. Quelqu'un a-t-il déjà écrit un tel filtre et sait comment l'utiliser?Réponses:
Une manière plus élégante serait d'utiliser une expression régulière (regex) comme suit:
Pour l'utiliser, procédez comme suit:
la source
Solution plus simple sans utiliser regex:
Utiliser:
la source
Cette implémentation de
InputFilter
résout le problème.la source
Voici un exemple de InputFilter qui que 4 chiffres maximum avant la virgule décimale et 1 chiffre maximum par la suite.
Valeurs autorisées par edittext: 555,2 , 555 , .2
Valeurs bloquées par edittext: 55555.2 , 055.2 , 555.42
la source
J'ai fait quelques corrections pour la solution @Pinhassi. Il gère certains cas:
1.vous pouvez déplacer le curseur n'importe où
2. manipulation du signe moins
3.digitsbefore = 2 et digitsafter = 4 et vous entrez 12.4545. Ensuite, si vous souhaitez supprimer ".", Il ne le permettra pas.
la source
android:inputType="number"
ou siandroid:inputType="numberDecimal"
cela ne permet pas de taper moins, celaandroid:digits="0123456789.-"
n'aide pasJe n'aime pas l'autre solution et j'ai créé la mienne. Avec cette solution, vous ne pouvez pas entrer plus de MAX_BEFORE_POINT chiffre avant le point et les décimales ne peuvent pas dépasser MAX_DECIMAL.
Vous ne pouvez tout simplement pas taper le chiffre en excès, pas d'autres effets! En plus si vous écrivez "." il tape "0".
Définissez EditText dans la mise en page sur:
android: inputType = "numberDecimal"
Ajoutez l'écouteur dans votre onCreate. Si vous souhaitez modifier le nombre de chiffres avant et après le point, éditez l'appel à PerfectDecimal (str, NUMBER_BEFORE_POINT, NUMBER_DECIMALS), ici est mis à 3 et 2
Incluez cette fonction:
Et c'est fait!
la source
J'ai réalisé cela avec l'aide de
TextWatcher
de la manière suivanteCette solution ne permettra pas à l'utilisateur d'entrer plus de deux chiffres après la virgule décimale. Vous pouvez également entrer n'importe quel nombre de chiffres avant la virgule décimale. Consultez ce blog http://v4all123.blogspot.com/2013/05/set-limit-for-fraction-in-decimal.html pour définir un filtre pour plusieurs EditText. J'espère que cela aidera. Je vous remercie.
la source
count
avec-1
. Alors seulement cela fonctionnera correctement.int count = -1;
listener
. De toute façon s'il vous plaît jeter un oeil mon blog un message . Vous pouvez avoir une idée. Si vous ne pouvez pas, faites-le moi savoir. Je vais vous aider à aborder cette question.Le InputFilter que j'ai créé vous permet de configurer le nombre de chiffres avant et après la décimale. De plus, il interdit les zéros non significatifs.
la source
L'exigence est de 2 chiffres après la virgule. Il ne devrait y avoir aucune limite pour les chiffres avant la virgule décimale. Donc, la solution devrait être,
Et utilisez-le comme,
Merci à @Pinhassi pour l'inspiration.
la source
Ma solution est simple et fonctionne parfaitement!
Usage:
la source
isValid()
vers le constructeur pour éviter de recréer des modèles à chaqueisValid()
appel.Essayez d'utiliser NumberFormat.getCurrencyInstance () pour formater votre chaîne avant de la mettre dans un TextView.
Quelque chose comme:
Modifier - Il n'y a pas de type d'entrée pour la devise que je pourrais trouver dans la documentation. J'imagine que c'est parce que certaines devises ne suivent pas la même règle pour les décimales, comme le yen japonais.
Comme LeffelMania l'a mentionné, vous pouvez corriger l'entrée de l'utilisateur en utilisant le code ci-dessus avec un
TextWatcher
qui est défini sur votreEditText
.la source
Solution @Pinhassi légèrement améliorée.
Fonctionne très bien. Il valide les chaînes concaténées.
la source
J'ai modifié les solutions ci-dessus et créé la suivante. Vous pouvez définir le nombre de chiffres avant et après la virgule décimale.
}
la source
Lorsque vous quittez la phase d'édition, cela formate le champ au bon format. En ce moment, il n'a que 2 caractères décimaux. Je pense que c'est un moyen assez simple de le faire.
la source
Toutes les réponses ici sont assez complexes, j'ai essayé de le rendre beaucoup plus simple.Regardez mon code et décidez par vous-même -
la source
J'ai vraiment aimé la réponse de Pinhassi, mais j'ai remarqué qu'après que l'utilisateur avait entré les chiffres du nombre spécifié après la virgule décimale, vous ne pouviez plus entrer de texte à gauche du point décimal. Le problème était que la solution ne testait que le texte précédent qui avait été saisi, et non le texte actuel saisi. Voici donc ma solution qui insère le nouveau caractère dans le texte d'origine pour validation.
Et l'appel pour définir le filtre editText
la source
J'ai amélioré la solution qui utilise une expression régulière de Pinhassi afin qu'elle gère également correctement les cas de bord. Avant de vérifier si l'entrée est correcte, la chaîne finale est d'abord construite comme décrit dans la documentation Android.
Usage:
la source
La classe Simple Helper est là pour empêcher l'utilisateur de saisir plus de 2 chiffres après la décimale:
la source
J'ai changé la réponse №6 (par Favas Kv) parce que là Vous pouvez mettre juste le point en première position.
la source
Comme d'autres l'ont dit, j'ai ajouté cette classe à mon projet et défini le filtre sur
EditText
Je veux.Le filtre est copié à partir de la réponse de @ Pixel. Je mets juste tout ça ensemble.
Maintenant, définissez le filtre dans votre
EditText
comme ça.Ici, une chose importante est que cela résout mon problème de ne pas permettre d'afficher plus de deux chiffres après la virgule décimale,
EditText
mais le problème est que lorsque je àgetText()
partir de celaEditText
, il renvoie toute l'entrée que j'ai tapée.Par exemple, après avoir appliqué le filtre sur le
EditText
, j'ai essayé de définir l'entrée 1.5699856987. Donc, sur l'écran, il affiche 1,56, ce qui est parfait.Ensuite, j'ai voulu utiliser cette entrée pour d'autres calculs, donc je voulais obtenir le texte de ce champ d'entrée (
EditText
). Quand j'ai appelémEditText.getText().toString()
il renvoie 1.5699856987, ce qui n'était pas acceptable dans mon cas.J'ai donc dû analyser à nouveau la valeur après l'avoir obtenue à partir du fichier
EditText
.setScale
fait l'affaire ici après avoir récupéré le texte intégral duEditText
.la source
J'ai également rencontré ce problème. Je voulais pouvoir réutiliser le code dans de nombreux EditTexts. Voici ma solution:
Utilisation:
Classe:
la source
@Meh pour toi ..
la source
Une réponse très tardive: nous pouvons le faire simplement comme ceci:
la source
Voici ceux
TextWatcher
qui n'autorisent que n nombre de chiffres après la virgule décimale.TextWatcher
Comment utiliser
la source
Le moyen le plus simple d'y parvenir est:
la source
Voici ma solution:
Si l'utilisateur entre un nombre avec plus de deux nombres après la virgule décimale, il sera automatiquement corrigé.
J'espère avoir aidé!
la source
Cela fonctionne bien pour moi. Il permet de saisir une valeur même après la modification de la mise au point et la récupération. Par exemple:
123.00
,12.12
,0.01
, etc ..1.
Integer.parseInt(getString(R.string.valuelength))
Spécifie la longueur de l'entréedigits.Values
accessible depuisstring.xml
fichier. Il est très facile de modifier les valeurs. 2.Integer.parseInt(getString(R.string.valuedecimal))
, ceci est pour la limite maximum de décimales.Tableau de
EditText
valeurs qui permet d'effectuer une action.Je viens d'utiliser un tableau de valeurs contenant plusieurs fichiers suivant edittext
DecimalDigitsInputFilterNew.class
.la source
C'est pour s'appuyer sur la réponse de pinhassi - le problème que j'ai rencontré était que vous ne pouviez pas ajouter de valeurs avant la virgule une fois la limite décimale atteinte. Pour résoudre le problème, nous devons construire la chaîne finale avant de faire la correspondance de modèle.
la source
la source
source
aprèset.getText()
. Il comprend toujours que les gens tapent à la fin de la boîte au lieu du début de la boîte.StringBuilder stringBuilder = new StringBuilder(text.getText().toString()); stringBuilder.replace(dstart, dend, source.toString()); String temp = stringBuilder.toString();
devrait marcher. Merci quand même.Créez une nouvelle classe dans Android kotlin avec le nom DecimalDigitsInputFilter
Appelez cette classe avec la ligne suivante
il y a trop de réponses pour la même chose mais cela vous permettra d'entrer 8 chiffres avant la décimale et 2 chiffres après la décimale
les autres réponses n'acceptent que 8 chiffres
la source