Successivo: , Su: Funzioni di tipo generale   [Contenuti][Indice]


10.2.1 Conversione di stringhe in numeri

La funzione strtonum() (vedi la sezione Funzioni di manipolazione di stringhe) è un’estensione gawk. La seguente funzione fornisce un’implementazione per altre versioni di awk:

# mystrtonum --- converte stringhe in numeri

function mystrtonum(str,        ret, n, i, k, c)
{
    if (str ~ /^0[0-7]*$/) {
        # ottale
        n = length(str)
        ret = 0
        for (i = 1; i <= n; i++) {
            c = substr(str, i, 1)
            # index() restituisce 0 se c non è nella stringa,
            # e anche se c == "0"
            k = index("1234567", c)

            ret = ret * 8 + k
        }
    } else if (str ~ /^0[xX][[:xdigit:]]+$/) {
        # esadecimale
        str = substr(str, 3)    # via 0x iniziale
        n = length(str)
        ret = 0
        for (i = 1; i <= n; i++) {
            c = substr(str, i, 1)
            c = tolower(c)
            # index() restituisce 0 se c non è nella stringa,
            # e anche se c == "0"
            k = index("123456789abcdef", c)

            ret = ret * 16 + k
        }
    } else if (str ~ \
  /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) {
        # numero decimale, eventualmente in virgola mobile
        ret = str + 0
    } else
        ret = "NON-UN-NUMERO"

    return ret
}

# BEGIN {     # dati per un test
#     a[1] = "25"
#     a[2] = ".31"
#     a[3] = "0123"
#     a[4] = "0xdeadBEEF"
#     a[5] = "123.45"
#     a[6] = "1.e3"
#     a[7] = "1.32"
#     a[8] = "1.32E2"
#
#     for (i = 1; i in a; i++)
#         print a[i], strtonum(a[i]), mystrtonum(a[i])
# }

La funzione cerca dapprima numeri ottali in stile C (base 8). Se la stringa in input corrisponde all’espressione regolare che descrive i numeri ottali, mystrtonum() esegue il ciclo per ogni carattere presente nella stringa. Imposta k all’indice in "1234567" della cifra ottale corrente. Il codice di ritorno sarà lo stesso numero della cifra, o zero se il carattere non c’è, il che succederà per ogni cifra ‘0’. Questo si può fare, perché il test di regexp nell’istruzione if assicura che vengano scelti per essere convertiti solo dei numeri ottali.

Una logica simile si applica al codice che ricerca e converte un valore esadecimale, che inizia con ‘0x’ o ‘0X’. L’uso di tolower() semplifica il calcolo per trovare il valore numerico corretto per ogni cifra esadecimale.

Infine, se la stringa corrisponde alla (piuttosto complicata) regexp per un intero decimale regolare o per un numero in virgola mobile, il calcolo ‘ret = str + 0’ fa sì che awk converta il valore in un numero.

È incluso un programma di verifica commentato, in modo che la funzione possa essere verificata con gawk e il risultato confrontato con la funzione predefinita strtonum().


Successivo: , Su: Funzioni di tipo generale   [Contenuti][Indice]