51 votes

Quel est le meilleur moyen d'entrer des valeurs numériques avec des points décimaux?

Dans mon application, les utilisateurs doivent pouvoir saisir des valeurs numériques avec des décimales. L'iPhone ne fournit pas de clavier spécifique à cet effet - seulement un pavé numérique et un clavier avec des chiffres et des symboles.

Existe-t-il un moyen simple d’utiliser ce dernier et d’empêcher toute saisie non numérique sans avoir à regex le résultat final?

Merci!

53voto

Zebs Points 3224

Je pense qu’il serait bon de souligner qu’à partir d’iOS 4.1, vous pouvez utiliser le nouveau UIKeyboardTypeDecimalPad .

Alors maintenant, il vous suffit de:

 myTextField.keyboardType=UIKeyboardTypeDecimalPad;
 

49voto

shek Points 6107

Une solution plus élégante se trouve également être le plus simple.

Vous n'avez pas besoin d'une touche séparateur de décimales

Pourquoi? Parce que vous pouvez simplement déduire à partir de l'entrée de l'utilisateur. Par exemple, aux états-unis les paramètres régionaux lorsque vous entrez dans $1.23, vous commencez par entrer les numéros 1-2-3 (dans cet ordre). Dans le système, où chaque personnage est saisi, ce serait reconnu comme:

  • utilisateur entre 1: $0.01
  • l'utilisateur entre les 2: $0.12
  • utilisateur entre 3: $1.23

Remarquez comment nous avons déduit le séparateur décimal basée sur la saisie de l'utilisateur. Maintenant, si l'utilisateur veut entrer dans $1.00, ils seraient tout simplement d'entrer les numéros 1-0-0.

Pour que votre code pour gérer les devises de différents paramètres régionaux, vous avez besoin pour obtenir le maximum de la fraction chiffres de la monnaie. Cela peut être fait avec l'extrait de code suivant:

NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
int currencyScale = [currencyFormatter maximumFractionDigits];

Par exemple, le yen Japonais a un maximum fraction chiffres de 0. Donc, quand il s'agit de yens d'entrée, il n'y a pas de séparateur décimal et donc même pas besoin de s'inquiéter à propos des fractions.

Cette approche du problème permet d'utiliser le stock d'entrée numérique clavier Apple sans les maux de tête de la coutume, de claviers, de la regex de validation, etc.

12voto

Mike Weller Points 28387

Voici un exemple de solution proposée dans la réponse acceptée. Cela ne gère pas les autres monnaies ou quoi que ce soit - dans mon cas, je n'avais besoin que d'une prise en charge des dollars, peu importe les paramètres régionaux / la devise, donc cela a été OK pour moi:

 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
    replacementString:(NSString *)string {

    double currentValue = [textField.text doubleValue];
    //Replace line above with this
    //double currentValue = [[textField text] substringFromIndex:1] doubleValue];
    double cents = round(currentValue * 100.0f);

    if ([string length]) {
        for (size_t i = 0; i < [string length]; i++) {
            unichar c = [string characterAtIndex:i];
            if (isnumber(c)) {
                cents *= 10;
                cents += c - '0'; 
            }            
        }
    } else {
        // back Space
        cents = floor(cents / 10);
    }

    textField.text = [NSString stringWithFormat:@"%.2f", cents / 100.0f];
    //Add this line
    //[textField setText:[NSString stringWithFormat:@"$%@",[textField text]]];
    return NO;
}
 

Les tours et les planchers sont importants a) car la représentation en virgule flottante perd parfois .00001 ou autre chose et b) la chaîne de format arrondissant toute précision que nous avons supprimée dans la partie arrière.

3voto

Alex Points 19842

Je voulais faire exactement la même chose, sauf avec des monnaies plutôt que directement les valeurs décimales.

J'ai fini par créer une vue personnalisée qui contient un objet UITextField et un UILabel. L'étiquette couvre le champ de texte, mais le champ de texte reçoit toujours la touche. J'utilise le UITextFieldTextDidChange notification d'observer les changements dans le champ de texte (et j'ai utilisé un NSNumberFormatter à son tour le résultat dans une formaté la valeur de la monnaie) pour mettre à jour l'étiquette.

Pour désactiver la loupe qui permet à l'utilisateur de repositionner le point d'insertion, vous aurez besoin d'utiliser un objet UITextField sous-classe et remplacer touchesBegan:withEvent: et jeu il de ne rien faire.

Ma solution serait peut-être différent de ce que vous avez besoin, car la virgule est toujours fixe-j'utilise le système de la monnaie paramètre pour déterminer combien il y en chiffres devrait être après le point décimal. Cependant, le pavé numérique n'a pas de point décimal. Et vous ne pouvez pas ajouter des boutons du clavier (ce qui est particulièrement aggravante parce qu'il y a un bouton vide dans le coin inférieur gauche du clavier qui serait parfait pour un point décimal!) Donc je n'ai pas de solution pour ça, malheureusement.

2voto

Martin v. Löwis Points 61768

En fonction de l'application spécifique, fournir un curseur sur lequel l'utilisateur peut sélectionner une position peut constituer un meilleur choix sur l'iphone. Ensuite, aucun chiffre ne doit être entré du tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X