2010-12-01 20 views
15

J'utilise DecimalFormat pour analyser/valider les entrées utilisateur. Malheureusement, il permet aux caractères comme suffixe lors de l'analyse.Pourquoi DecimalFormat autorise-t-il les caractères en suffixe?

code Exemple:

try { 
    final NumberFormat numberFormat = new DecimalFormat(); 
    System.out.println(numberFormat.parse("12abc")); 
    System.out.println(numberFormat.parse("abc12")); 
} catch (final ParseException e) { 
    System.out.println("parse exception"); 
} 

Résultat:

12 
parse exception 

je fait attendre une exception pour les deux Parse d'entre eux. Comment puis-je dire DecimalFormat de ne pas autoriser la saisie comme "12abc"?

Répondre

16

la documentation De NumberFormat.parse:

texte Parsis depuis le début de la chaîne donnée pour produire un nombre. La méthode peut ne pas utiliser le texte entier de la chaîne donnée.

Voici un exemple qui devrait vous donner une idée de la façon de vous assurer que la chaîne entière est prise en compte.

import java.text.*; 

public class Test { 
    public static void main(String[] args) { 
     System.out.println(parseCompleteString("12")); 
     System.out.println(parseCompleteString("12abc")); 
     System.out.println(parseCompleteString("abc12")); 
    } 

    public static Number parseCompleteString(String input) { 
     ParsePosition pp = new ParsePosition(0); 
     NumberFormat numberFormat = new DecimalFormat(); 
     Number result = numberFormat.parse(input, pp); 
     return pp.getIndex() == input.length() ? result : null; 
    } 
} 

sortie:

12 
null 
null 
2

Utilisez la surcharge parse(String, ParsePosition) du procédé, et vérifier la .getIndex() de l'ParsePosition après l'analyse, pour voir si elle correspond à la longueur de l'entrée.