Successivo: Funzione assert, Su: Funzioni di tipo generale [Contenuti][Indice]
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: Funzione assert, Su: Funzioni di tipo generale [Contenuti][Indice]