Question

J'ai une chaîne et je veux vérifier qu'il ne se compose que de chiffres. Je ne veux pas vraiment (ou besoin) analyser ou quoi que ce soit, je veux juste savoir qu'il ne contient rien, mais les chiffres (et pas de séparateur à virgule flottante non plus, juste chiffres).

PHP a cette fonction bien appelé ctype_digit . Y at-il quelque chose de similaire pour C # partout dans le Net Framework? Ou dois-je utiliser une expression régulière ou quelque chose comme ça?

Création d'un regex pour ce serait bien sûr assez simple, mais je voudrais de ne pas l'utiliser s'il y a de meilleures façons: p

Était-ce utile?

La solution 2

La réponse de @ bruno conde m'a fait penser à ceci: D

if(subject.All(char.IsDigit))
    // Do something

Peut pas croire que je ne pensais pas avant ...

Autres conseils

Vous pouvez utiliser int.TryParse . Il retourne vrai si la chaîne fournie représente un numéro valide, sinon false. Ne pas oublier d'utiliser NumerStyles.None pour interdire les espaces vides et le signe plus / moins.

UPDATE : Comme le dit EMPI, cela ne fonctionnera pas pour les chaînes très grandes. Si vous avez des chaînes arbitrairement grandes, peut-être une expression régulière est votre seule option. Vous pouvez faire quelque chose comme Regex.IsMatch(theString,"^[0-9]+$")

bool onlyDigits = "1234".All(c => char.IsDigit(c));

Il me semble que, vous feriez mieux d'utiliser regex pour faire le travail pour vous ... « \ d + » devrait le faire ... ok, vous avez dit que vous ne voulez pas l'utiliser ... mais il est à toute épreuve manière d'assurer la chaîne contient uniquement des chiffres, alors si l'expression rationnelle passe, vous pouvez utiliser immédiatement int.Parse (...).

Oui, vous pouvez utiliser

bool Int32.TryParse(string s, out int result);

Exemple de code:

string myString = "1265";
int myInt;

if (Int32.TryParse(myString,myInt) // Returns true if mystring contains only digits
{
...
}

Une autre option consiste à utiliser Regex:

    public static bool IsDigit(string myString)
    {
        string pattern = @"^\d*$";

        if (Regex.IsMatch(myString, pattern))
            return true;
        else
            return false;
    }

Vous pouvez modifier le modèle selon vos besoins.

Il n'y a pas de méthode intégrée. Int32.TryParse ou Int64.TryParse ne fonctionnera pas pour de très longues chaînes contenant que des chiffres (ils peuvent aussi permettre à d'autres caractères utilisés pour représenter des nombres entiers).

Comme d'autres l'ont dit, vous pouvez utiliser la méthode int.TryParse, bien que, sauf si votre numéro est vraiment vraiment ÉNORME, vous pouvez utiliser la méthode TryParse d'autres types, qui ont une plus grande gamme que celle des int32. (Bien sûr en utilisant l'option NumberStyles.None, afin d'éviter les signes et la ponctuation).

Voici la décomposition:

  1. int -2147483648 .. 2147483647
  2. uint 0 .. 4294967295
  3. long -9.223.372.036.854.775.808 .. 9.223.372.036.854.775.807
  4. ulong 0 .. 18.446.744.073.709.551.615
  5. float -3.402823e38 .. 3.402823e38
  6. double -1.79769313486232e308 .. 1.79769313486232e308
  7. decimal -79228162514264337593543950335 .. 79228162514264337593543950335

Celui qui peut analyser les plus grands nombres est Double. Si vous avez besoin d'utiliser le numéro, vous perdrez une certaine précision, mais il peut analyser des nombres très longs (bien que vous dites que vous ne avez pas besoin de l'utiliser de sorte qu'il ne devrait pas être un problème). Lors d'un test rapide, je l'ai fait, il a réussi à analyser avec succès la chaîne suivante:

79228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335234234234234243423

(qu'est à dire 308 caractères, il échouerait avec un nombre plus)

Pourtant, si vous ne comptez pas utiliser le numéro, il peut-être trop, donc je choisiriez la Regex, ou mieux encore la boucle en vérifiant que chaque caractère est un chiffre.

Si vous voulez aller alors un peu fou, vous pouvez diviser cela en plusieurs petites chaînes, et d'utiliser la bibliothèque de tâches pour vérifier d'une manière parallèle: P

(je sais qu'il est un peu hors-sujet maintenant, mais si vous voulez le faire, vous devriez vérifier parallel.for et Partition Ranger, consultez cette 10min C9 clip: parallèle Ranger Partition)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top