Quelle est la meilleure façon de valider la monnaie d'entrée dans UITextField?
Mon application permet à l'utilisateur de saisir une valeur numérique (de monnaie) dans un UITextField
de contrôle, mais la disposition de clavier que je souhaite est disponible est malheureusement pas une des options intégrées, si j'avais à choisir les "Chiffres & la Ponctuation" option dans l'Interface Builder. Voici la boîte de dialogue correspondante de la fenêtre de l'IB:
Alors, quand mon application demande à l'utilisateur pour l'entrée, c'est l'affichage de la suivante:
Qui est parfaitement bien, mais regardez toutes les clés supplémentaires disponibles pour l'utilisateur! On pourrait facilement entrer "12;56!" dans le champ de texte, et je suppose que je dois valider que d'une certaine façon.
Donc ma question est: comment puis-je valider les valeurs de devise conclu un UITextField
?
Vous devez vous connecter pour publier un commentaire.
Peut-être vous pouvez attacher un
UITextFieldDelegate
sur le contrôle et mettre en œuvre lestextField:shouldChangeCharactersInRange:replacementString:
de Cette façon, si il voit tous les personnages que vous ne voulez pas dans le domaine, il peut la refuser.J'ai envie de répondre parce que c'était la première entrée que j'ai vu quand j'ai googlé et la première réponse ne me permet pas d'entrer dans un bureau.
Je suis allemand, et en allemagne (et dans de nombreux autres pays), nous utilisons
,
comme le decimalseparator.Je viens d'écrire une méthode similaire, et c'est ce que j'ai en ce moment.
Alors que vous pouvez putz autour de la NSNumberFormatter, je l'ai trouvé plus facile de l'écran mais rien de 0-9 et .
Cela fonctionne bien pour moi:
J'ai trouvé ceci pour être un relativement propre approche. Je n'ai pas testé avec les non-AMÉRICAINS, mais comme il utilise le NSNumberFormatter propriétés je crois qu'il devrait les gérer correctement.
Commencer par la mise en place d'un module de formatage de la place:
Utiliser le formateur d'analyser et de reformater leur entrée. Il gère également le déplacement le nombre lorsque les chiffres sont ajoutés et supprimés.
En collaboration avec le
textField:shouldChangeCharactersInRange:replacementString:
suggestion faite par Marc, vous devez passer le texte par le biais d'unNSNumberFormatter
à l'aide d'unNSNumberFormatterCurrencyStyle
. Cela permettra de gérer les caprices de la devise mise en forme et gérer les paramètres régionaux des options spécifiques.Il y a une "mise en forme des Données Guide de Programmation du Cacao" dans la section iPhone documentation si vous recherchez pour cela. Malheureusement, la plupart de l'INTERFACE utilisateur de l'information ici est Mac OS X spécifique (ne fonctionne pas sur iPhone) mais il va vous montrer comment utiliser le module de formatage des classes.
J'ai trouvé que le shouldChangeCharactersInRange vis jusqu'à la fenêtre contextuelle du clavier, la touche retour arrière et le bouton "Terminé" ainsi. J'ai découvert que si j'ai manipulé 0 chaînes de longueur et a permis le contrôle des caractères bien, il a bien fonctionné.
Je n'aime pas utiliser NSNumberFormatter parce qu'il insiste sur le fait que le nombre est bien formé à tous les stades, tandis que l'utilisateur est en train de modifier, et qui peut être exaspérant si vous avez, disons, veulent avoir deux décimales du nombre pour un moment jusqu'à ce que vous supprimez l'un qui est dans le mauvais endroit.
Voici le code que j'ai utilisé:
Où l'auto.characterSet détient les caractères qui sont acceptables, j'ai utilisé cette méthode pour créer une monnaie:
Quelque peu malheureux code
[[currencySet copy] autorelease]
retourne immuable NSCharacterSet.À l'aide de
[NSCharacterSet decimalDigitCharacterSet]
comprend également l'Indic et équivalent arabe personnages qui, espérons-le, signifie que les gens qui utilisent ces langues peuvent utiliser leur alphabet chiffres pour saisir des chiffres.Il est toujours nécessaire de vérifier que NSNumberFormatter peut analyser l'entrée de l'utilisateur et d'alerte si elle ne peut pas; néanmoins, il fait une belle expérience quand seulement légitime caractères peuvent être saisis.
Je n'arrête pas de voir que les gens ne savent pas comment déterminer correctement la chaîne obtenue lors de la mise en œuvre de shouldChangeCharactersInRange.
Voici comment vous obtenez le nouveau texte qui serait entré si vous retourné OUI:
Une fois que vous avez ce nouveau texte, il est facile de vérifier si ce texte est un nombre valide ou non, et de retour OUI ou NON en conséquence.
Gardez à l'esprit que toutes les autres solutions, comme celles présentées ici, où l'on vérifie la longueur de la chaîne "string", et, peut ne pas fonctionner correctement si l'utilisateur tente de modifier la chaîne à l'aide d'un clavier bluetooth avec les touches du curseur ou en utilisant les fonctions d'édition avancées (sélectionner, couper, coller).
Si vous voulez seulement être en mesure de saisir des nombres - vous pourriez aussi envisager le pavé numérique
Après la découverte d'une solution rapide sur un débordement de pile de la poignée de monnaie des états-unis, j'ai réécrit la fonction pour gérer en toute sécurité les monnaies internationales ainsi. Cette solution permettra de valider de manière dynamique la saisie de l'utilisateur à partir d'un objet UITextField, la correction en cours de saisie.
À l'aide d'un NSNumberFormatter est la réponse correcte. Il prendra en charge la validation et la conversion de la chaîne et du bon type d'objet.
Vous pouvez également utiliser Gamma-Point de la solution et d'évaluer si *un certain nombre est Nul, si son Néant, c'est un personnage qui n'était pas 0-9 . ou , a été saisie de cette façon, vous pouvez valider des chiffres, il va néant la variable si un certain nombre de char est entré.
Je ne Pouvais pas trouver la mise en œuvre appropriée de la monnaie valider. Voici ma variante:
À l'aide de shouldChangeCharactersInRange vis jusqu'à la pop-up de votre clavier comme la touche retour arrière ne fonctionne pas.
Numéro de formateur est le chemin à parcourir. Voici un exemple que j'ai utilisé pour trouver des décimales. Je l'appelle, lors de la validation de check - pour, par exemple, lorsque l'utilisateur clique sur le bouton enregistrer.