Successivo: , Precedente: , Su: Printf   [Contenuti][Indice]


5.5.3 Modificatori per specifiche di formato printf

Una specifica di formato può anche includere dei modificatori che possono controllare che parte stampare del valore dell’elemento, e anche quanto spazio utilizzare per stamparlo. I modificatori sono posizionati tra il ‘%’ e la lettera che controlla il formato. Negli esempi seguenti verrà usato il simbolo del punto elenco “•” per rappresentare spazi nell’output. Questi sono i modificatori previsti, nell’ordine in cui possono apparire:

N$

Una costante intera seguita da un ‘$’ è uno specificatore di posizione. Normalmente, le specifiche di formato sono applicate agli argomenti nell’ordine in cui appaiono nella stringa di formato. Con uno specificatore di posizione, la specifica di formato è applicata a un argomento indicato per numero, invece che a quello che sarebbe il prossimo argomento nella lista. Gli specificatori di posizione iniziano a contare partendo da uno. Quindi:

printf "%s %s\n", "Non", "v'allarmate"
printf "%2$s %1$s\n", "v'allarmate", "Non"

stampa per due volte il famoso consiglio amichevole.

A prima vista, questa funzionalità non sembra di grande utilità. Si tratta in effetti di un’estensione gawk, pensata per essere usata nella traduzione di messaggi emessi in fase di esecuzione. Vedi la sezione Riordinare argomenti di printf, che descrive come e perché usare specificatori di posizione. Per ora li possiamo ignorare.

- - (Segno meno)

Il segno meno, usato prima del modificatore di larghezza (si veda più avanti in questa lista), richiede di allineare a sinistra l’argomento mantenendo la larghezza specificata. Normalmente, l’argomento è stampato allineato a destra, con la larghezza specificata. Quindi:

printf "%-6s", "pippo"

stampa ‘pippo•’.

spazio

Applicabile a conversioni numeriche, richiede di inserire uno spazio prima dei valori positivi e un segno meno prima di quelli negativi.

+

Il segno più, usato prima del modificatore di larghezza (si veda più avanti in questa lista), richiede di mettere sempre un segno nelle conversioni numeriche, anche se il dato da formattare ha valore positivo. Il ‘+’ prevale sul modificatore spazio.

#

Richiede di usare una “forma alternativa” per alcune lettere di controllo. Per ‘%o’, preporre uno zero. Per ‘%x’ e ‘%X’, preporre ‘0x’ o ‘0X’ se il numero è diverso da zero. Per ‘%e’, ‘%E’, ‘%f’, e ‘%F’, il risultato deve contenere sempre un separatore decimale. Per %g e %G, gli zeri finali non significativi non sono tolti dal numero stampato.

0

Uno ‘0’ (zero) iniziale serve a richiedere che l’output sia riempito con zeri (invece che con spazi), prima delle cifre significative. Questo si applica solo ai formati di output di tipo numerico. Questo flag ha un effetto solo se la larghezza del campo è maggiore di quella del valore da stampare.

'

Un carattere di apice singolo o un apostrofo è un’estensione POSIX allo standard ISO C. Indica che la parte intera di un valore in virgola mobile, o la parte intera di un valore decimale intero, ha un carattere di separazione delle migliaia. Ciò è applicabile solo alle localizzazioni che prevedono un tale carattere. Per esempio:

$ cat migliaia.awk          Visualizza il programma sorgente
-| BEGIN { printf "%'d\n", 1234567 }
$ LC_ALL=C gawk -f migliaia.awk
-| 1234567                   Risultato nella localizzazione "C"
$ LC_ALL=en_US.UTF-8 gawk -f migliaia.awk
-| 1,234,567   Risultato nella localizzazione UTF inglese americana

Per maggiori informazioni relative a localizzazioni e internazionalizzazioni, si veda Il luogo fa la differenza.

NOTA: Il flag'’ è una funzionalità interessante, ma utilizza un carattere che è fonte di complicazioni, perché risulta difficila da usare nei programmi scritti direttamente sulla riga di comando. Per informazioni sui metodi appropriati per gestire la cosa, si veda Uso di apici nella shell..

larghezza

Questo è un numero che specifica la larghezza minima che deve occupare un campo. L’inserimento di un numero tra il segno ‘%’ e il carattere di controllo del formato fa sì che il campo si espanda a quella larghezza. Il modo di default per fare questo è di aggiungere degli spazi a sinistra. Per esempio:

printf "%6s", "pippo"

stampa ‘•pippo’.

il valore di larghezza indica la larghezza minima, non la massima. Se il valore dell’elemento richiede più caratteri della larghezza specificata, questa può essere aumentata secondo necessità. Quindi, per esempio:

printf "%6s", "pippo-pluto"

stampa ‘pippo-pluto’.

Anteponendo un segno meno alla larghezza si richiede che l’output sia esteso con spazi a destra, invece che a sinistra.

.precisione

Un punto, seguito da una costante intera specifica la precisione da usare nella stampa. Il tipo di precisione varia a seconda della lettera di controllo:

%d, %i, %o, %u, %x, %X

Minimo numero di cifre da stampare.

%e, %E, %f, %F

Numero di cifre alla destra del separatore decimale.

%g, %G

Massimo numero di cifre significative.

%s

Massimo numero di caratteri della stringa che possono essere stampati.

Quindi, l’istruzione:

printf "%.4s", "foobar"

stampa ‘foob’.

Le funzionalità di larghezza e precisione dinamiche (cioè, "%*.*s") disponibili nell’istruzione printf della libreria C sono utilizzabili. Invece che fornire esplicitamente una larghezza e/o una precisione nella stringa di formato, queste sono fornite come parte della lista degli argomenti. Per esempio:

w = 5
p = 3
s = "abcdefg"
printf "%*.*s\n", w, p, s

equivale esattamente a:

s = "abcdefg"
printf "%5.3s\n", s

Entrambi i programmi stampano ‘••abc’. Versioni più datate di awk non consentivano questa possibilità. Dovendo usare una di queste versioni, è possibile simulare questa funzionalità usando la concatenazione per costruire una stringa di formato, come per esempio:

w = 5
p = 3
s = "abcdefg"
printf "%" w "." p "s\n", s

Questo codice non è di facile lettura, ma funziona.

Chi programma in C probabilmente è abituato a specificare modificatori addizionali (‘h’, ‘j’, ‘l’, ‘L’, ‘t’ e ‘z’) nelle stringhe di formato di printf. Questi modificatori non sono validi in awk. La maggior parte della implementazioni di awk li ignora senza emettere messaggi. Se si specifica l’opzione --lint sulla riga di comando (vedi la sezione Opzioni sulla riga di comando), gawk emette un messaggio di avvertimento quando li si usa. Se si specifica l’opzione --posix, il loro uso genera un errore fatale.


Successivo: , Precedente: , Su: Printf   [Contenuti][Indice]