2010-09-27 5 views

Répondre

19
if (/\D/)   { print "has nondigits\n" } 
if (/^\d+$/)   { print "is a whole number\n" } 
if (/^-?\d+$/)  { print "is an integer\n" } 
if (/^[+-]?\d+$/) { print "is a +/- integer\n" } 
if (/^-?\d+\.?\d*$/) { print "is a real number\n" } 
if (/^-?(?:\d+(?:\.\d*)?&\.\d+)$/) { print "is a decimal number\n" } 
if (/^([+-]?)(?=\d&\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/) 
        { print "a C float\n" } 

pris d'ici: http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#Perl

+2

Si vous insistez sur un regex, obtenir de Regexp :: Common :) –

+1

Et, chacun de ces regexes qui utilise l'ancre $ permet un saut de ligne à la fin de la valeur. C'est une erreur dans perlfaq4 (j'ai maintenant patché les docs pour supprimer cette erreur), où Rosetta Code a eu son exemple. Cet exemple, cependant, était de déterminer quel genre de numéro il était, pas que ce soit une sorte de numéro. –

+0

Corrigez-moi si je me trompe - mais il me semble que dans le cas particulier de vérifier strictement les chiffres (ie, sous-ensemble de numérique, car un numérique peut avoir un point décimal et éventuellement un signe négatif ou même un signe positif , ainsi que des virgules ou d'autres caractères de regroupement visuel utilisés pour regrouper les caractères en trois pour la lecture visuelle), alors le "/ \ D /" est - où les chaînes n'existent pas au test de chiffres seulement - toujours plus efficace que "/^\ d + $/"car"/\ D/"est vrai lors de l'analyse du premier caractère non numérique. –

6

utilisant l'expression rationnelle, il est bon d'utiliser:

if ($var =~ /^\d+?$/) { 
    // integer 
} 

Vous pouvez également utiliser POSIX.

use POSIX; 

if (isdigit($var)) { 
    // integer 
} 
+0

Ceci trouve juste des chiffres. Il manque des littéraux qui sont des nombres qui ont plus que de simples chiffres. –

+0

Est-ce que POSIX fait partie du core perl? – 719016

+0

Apparemment, oui. –

24

Vous pouvez utiliser la fonction looks_like_number() à partir du module de base Scalar::Util.
Voir aussi la question perlfaq: How do I determine whether a scalar is a number/whole/integer/float?

+2

C'est sans doute la réponse la plus correcte, puisque 'Scalar :: Util' se connecte à l'API Perl pour demander à Perl si elle pense que la variable est numérique. Ainsi, pour la tâche commune d'éviter les avertissements «numériques», cela fonctionnera toujours. Bien sûr, il est parfois préférable de simplement dire "pas d'avertissement" numérique "; ... –

Questions connexes