Meilleure mise en œuvre pour un isNumber(string) méthode

Dans mon expérience limitée, j'ai été sur plusieurs projets qui ont eu une sorte de chaîne de l'utilitaire de classe avec des méthodes pour déterminer si une chaîne est un nombre. L'idée a toujours été le même, cependant, la mise en œuvre a été différent. Certains entourent un parse tentative avec try/catch

public boolean isInteger(String str) {
    try {
        Integer.parseInt(str);
        return true;
    } catch (NumberFormatException nfe) {}
    return false;
}

et d'autres correspondent avec la regex

public boolean isInteger(String str) {
    return str.matches("^-?[0-9]+(\\.[0-9]+)?$");
}

Est l'une de ces méthodes mieux que les autres? Personnellement, je préfère utiliser les regex approche, comme c'est concis, mais il va effectuer à la hauteur si elle est appelée lors de l'itération sur, disons, une liste de plusieurs centaines de milliers de chaînes?

Remarque: Comme je suis un peu nouveau sur le site je ne comprends pas tout ce Wiki de la Communauté d'affaires, donc si cela appartient-il laissez-moi savoir et je serai heureux de le déplacer.

EDIT:
Avec tous les TryParse suggestions, j'ai porté Asaph indice de référence du code (merci pour ce superbe post!) en C# et ajout d'une méthode TryParse. Et comme il semble, la TryParse gagne haut la main. Cependant, le try catch approche a pris un temps fou. Le point de moi de penser que je fait quelque chose de mal! J'ai aussi mis à jour regex pour traiter les négatifs et les points décimaux.

Résultats pour les mises à jour, C# de référence code:

00:00:51.7390000 for isIntegerParseInt
00:00:03.9110000 for isIntegerRegex
00:00:00.3500000 for isIntegerTryParse

À l'aide de:

static bool isIntegerParseInt(string str) {
    try {
        int.Parse(str);
        return true;
    } catch (FormatException e){}
    return false;
}

static bool isIntegerRegex(string str) {
    return Regex.Match(str, "^-?[0-9]+(\\.[0-9]+)?$").Success;
}

static bool isIntegerTryParse(string str) {
    int bob;
    return Int32.TryParse(str, out bob);
}
  • Je pense que TryParse est la meilleure façon
  • Quels sont vos entrées? Attendez-vous que 99% du temps, la chaîne ne peut être un nombre, et seulement 1% du temps, il ne sera pas? Ou est-ce l'inverse? Vous souhaitez optimiser le code de la branche qui est en fait va être exercés dans la plupart des cas.
  • Ajouté, puis retirez c# tag. 🙂
  • Une petite question à votre regex: "3.0" est un entier? Juste pour moi 3.0 == 3 🙂 Mais je ne connais pas tous vos besoins spécifiques...
  • Comunauté wiki sont pour les questions qui n'ont pas une (unique) réponse correcte
  • Cette question est C# ou Java? Il y a des contradictions de toute façon.
  • si vous êtes à la recherche d'une solution en java, pourquoi voudriez-vous faire C# de repères?

InformationsquelleAutor thorncp | 2009-09-02