Successivo: , Su: Conversione   [Contenuti][Indice]


6.1.4.1 Come awk converte tra stringhe e numeri

Le stringhe sono convertite in numeri e i numeri sono convertiti in stringhe, se il contesto del programma awk lo richiede. Per esempio, se il valore di pippo o pluto nell’espressione ‘pippo + pluto’ è una stringa, viene convertita in un numero prima di eseguire l’addizione. Se in una concatenazione di stringhe ci sono valori numerici, questi sono convertiti in stringhe. Si consideri il seguente esempio:

due = 2; tre = 3
print (due tre) + 4

Stampa il valore (numerico) di 27. I valori numerici delle variabili due e tre sono convertiti in stringhe e concatenati insieme. La stringa risultante è riconvertita nel numero 23, al quale poi viene aggiunto 4.

Se, per qualche ragione, si vuole forzare la conversione di un numero in una stringa, basta concatenare a quel numero la stringa nulla, "". Per forzare la conversione di una stringa in un numero, basta aggiungere zero a quella stringa. Una stringa viene convertita in un numero interpretando qualsiasi prefisso numerico della stringa come numero: "2.5" si converte in 2.5, "1e3" si converte in 1000, e "25fix" ha un valore numerico di 25. Le stringhe che non possono essere interpretate come numeri validi vengono convertite al valore zero.

Il modo esatto in cui i numeri sono convertiti in stringhe è controllato dalla variabile predefinita di awk CONVFMT (vedi la sezione Variabili predefinite). I numeri vengono convertiti usando la funzione sprintf() con CONVFMT come specificatore di formato (vedi la sezione Funzioni di manipolazione di stringhe).

Il valore di default di CONVFMT è "%.6g", che crea un valore con un massimo di sei cifre significative. Per alcune applicazioni potrebbe essere opportuno cambiare questo valore per ottenere una maggiore precisione. Sulla maggior parte delle macchine moderne normalmente bastano 17 cifre per esprimere esattamente il valore di un numero in virgola mobile.31

Si possono avere strani risultati se si imposta CONVFMT a una stringa che non indica a sprintf() come formattare i numeri in virgola mobile in un modo utile. Per esempio, se ci si dimentica la ‘%’ nel formato, awk converte tutti i numeri alla stessa stringa costante.

Come caso particolare, per un numero intero, il risultato della conversione a una stringa è sempre un numero intero, indipendentemente da quale sia il valore di CONVFMT. Dato il seguente fammento di codice:

CONVFMT = "%2.2f"
a = 12
b = a ""

b ha valore "12", non "12.00". (a.b.)

awk prima di POSIX usava OFMT per la conversione di stringhe

Prima dello standard POSIX, awk usava il valore di OFMT per convertire i numeri in stringhe. OFMT specifica il formato di output da usare per la stampa dei numeri con print. CONVFMT fu introdotto per separare la semantica della conversione dalla semantica della stampa. Sia CONVFMT che OFMT hanno lo stesso valore di dafault: "%.6g". Nella stragrande maggioranza dei casi, i vecchi programmi di awk non cambiano questo comportamento. Vedi la sezione L’istruzione print per maggiori informazioni sull’istruzione print.


Note a piè di pagina

(31)

Per casi eccezionali possono essere richieste fino a 752 cifre (!), non sembra che sia il caso di preoccuparsene qui.


Successivo: , Su: Conversione   [Contenuti][Indice]