-+  Associazione
-+  Documenti
 |-  Modern Perl
 |-  Bibliografia
 |-  Articoli
 |-  Talk
 |-  Perlfunc
 |-  F.A.Q.
 |-  F.A.Q. iclp
-+  Eventi
-+  Community
-+  Blog
-+  Link
Corso di Perl



 


indietro

[71] Come si fa a determinare se uno scalare è un numero/naturale/intero/in virgola mobile?

Assumendo che non vi importi delle notazioni IEEE come "NaN" o "Infinity", probabilmente vi basta usare una espressione regolare.

   if (/\D/)            { print "contiene caratteri non cifra\n" }
   if (/^\d+$/)         { print "e` un numero naturale\n" }
   if (/^-?\d+$/)       { print "e` un intero\n" }
   if (/^[+-]?\d+$/)    { print "e` un intero con +/-\n" }
   if (/^-?\d+\.?\d*$/) { print "e` un numero reale\n" }
   if (/^-?(?:\d+(?:\.\d*)?|\.\d+)$/) { print "e` un numero decimale\n" }
   if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
            { print "un numero in virgola mobile del C\n" }

Ci sono anche alcuni moduli d'uso comune per questo compito. Scalar::Util (distribuito con 5.8) fornisce l'accesso alla funzione interna di perl looks_like_number per determinare se una variabile assomiglia ad un numero. Data::Types esporta funzioni che validano i tipi di dato utilizzando sia le precedenti espressioni regolari sia altre. Terzo, c'è Regexp::Common che ha espressioni regolari per riconoscere diversi tipi di numeri. Questi tre moduli sono disponibili da CPAN.

Se vi trovate su un sistema POSIX, Perl supporta la funzione POSIX::strtod. La sue semantica è un po' scomoda, per cui eccovi prendi_num, una funzione di comodo. Questa funzione prede una stringa e restituisce il numero che ha trovato, oppure undef per un input che non è un numero in virgola mobile del C. La funzione controlla_num è un'interfaccia a prendi_num se si vuole solo chiedere "Questo è un numero in virgola mobile?"

    sub prendi_num {
       use POSIX qw(strtod);
       my $str = shift;
       $str =~ s/^\s+//;
       $str =~ s/\s+$//;
       $! = 0;
       my($num, $non_riconosciuto) = strtod($str);
       if (($str eq '') || ($non_riconosciuto != 0) || $!) {
            return undef;
       } else {
            return $num;
       }
    }
    sub controlla_num { defined prendi_num($_[0]) }

Potreste invece dare un'occhiata al modulo String::Scanf su CPAN. Il modulo POSIX (parte della distribuzione Perl standard) fornisce strtod e strtol per convertire stringhe in, rispettivamente, numero in virgola mobile e interi.

vedi in inglese

AUTORE E COPYRIGHT

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen e Nathan Torkington. Tutti i diritti riservati.

Questa documentazione è libera; puoi ridistribuirla e/o modificarla secondo gli stessi termini applicati al Perl.

Indipendentemente dalle modalitè di distribuzione, tutti gli esempi di codice in questo file sono rilasciati al pubblico dominio. Potete, e siete incoraggiati a farlo, utilizzare il presente codice o qualunque forma derivata da esso nei vostri programmi per divertimento o per profitto. Un semplice commento nel codice che dia riconoscimento alle FAQ sarebbe cortese ma non è obbligatorio.

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google