0
votes

Validez si la chaîne ne contient que des nombres

Mon application Java 'A' obtient le numéro de mobile sous forme de chaîne à partir d'une autre application Java. Donc, après que l'application A ait obtenu la chaîne de numéro de mobile, je dois valider si cette chaîne de numéro de mobile ne contient que des chiffres. Pour valider que j'ai utilisé une logique simple comme ci-dessous,

public static boolean containsOnlyDigits(String str, int n) {
    for (int i = 1; i < n; i++) {
        if (!Character.isDigit(str.charAt(i))) {
            return false;
        }
    }
    return true;
}

Je vérifie à partir de i = 1 que le premier caractère sera «+» pour le code du pays. Cette approche est O (n). Il existe une autre approche où nous pouvons utiliser Double.parseDouble(str) . Cela NumberFormatException afin que nous puissions attraper et considérer qu'il s'agit d'une chaîne alphanumérique.

Laquelle de ces approches est la mieux basée sur la performance?


6 commentaires

dans ses internes Double # parseDouble utilise une boucle avec isDigit ... Mais mieux vaut écrire un test JMH pour valider.


«Cette approche est O (n)» - Bien sûr qu'elle l'est. Quel est le problème?


@KonradRudolph Je veux savoir si nous pouvons utiliser Double.parseDouble au lieu d'utiliser notre propre implémentation et son impact sur les performances.


@Sel_va Je ne comprends toujours pas cette objection puisque Double.parseDouble évidemment aussi dans O (n) (comment pourrait-il ne pas?!), De même que toutes les autres méthodes imaginables.


Les numéros de téléphone portable peuvent contenir toutes sortes de caractères qui sont des nombres, le plus notable étant le signe + comme vous l'avez noté. Mais aussi des espaces, des parenthèses, des barres obliques, des tirets et quelques autres choses. Êtes-vous sûr que la chaîne doit être purement numérique?


@Sel_va - Si l'une des réponses a résolu votre problème, vous pouvez aider la communauté en la marquant comme acceptée. Une réponse acceptée aide les futurs visiteurs à utiliser la solution en toute confiance.


3 Réponses :


0
votes

Je vérifie à partir de i = 1 que le premier caractère sera «+» pour le code du pays.

Vous pouvez utiliser l'expression régulière, \+\d{n - 1} qui signifie que le premier caractère est + et les n - 1 caractères restants sont des chiffres. Cela signifie également que la longueur totale de la chaîne doit être n .

true
false
false
false
false
false

Production:

public class Main {
    public static void main(String[] args) {
        // Tests
        System.out.println(containsOnlyDigits("+123456789", 10));
        System.out.println(containsOnlyDigits("+123456789", 9));
        System.out.println(containsOnlyDigits("+123456789", 8));
        System.out.println(containsOnlyDigits("-123456789", 9));
        System.out.println(containsOnlyDigits("123456789", 9));
        System.out.println(containsOnlyDigits("ABC123456", 9));
    }

    public static boolean containsOnlyDigits(String str, int n) {
        String regex = "\\+\\d{" + (n - 1) + "}";
        return str.matches(regex);
    }
}

0 commentaires

1
votes

Vous pouvez essayer, supprimer le + si cela n'est pas utile:

 /**
 * Assuming that a phone number is of an international format, having `+` sign as prefix
 * and with no spaces in between the numbers, validates if a string is a valid phone number.
 * 
 * @param phone
 * @return resulting boolean
     */
private boolean isValidPhoneNumber(String phone) {
    if(phone == null) return false;
    
    return Pattern.matches("\\+\\d{11,15}", phone);
}


0 commentaires

0
votes

L'utilisation d'expressions régulières est coûteuse. Pour cette raison, vous pouvez facilement résoudre ce problème en utilisant la notation lambda dans Java 8.

boolean numericControl = str.chars().allMatch(x -> Character.isDigit(x));


1 commentaires

L'utilisation de regex n'est pas si coûteuse, en particulier avec une regex précompilée, et c'est une solution parfaitement appropriée pour la validation de la saisie de texte. En fait, la création de flux est également coûteuse.