Nel javascript manca una funzione che fornisca un output formattato, presente,
invece, in quasi tutti i linguaggi. Questa mancanza mette spesso in difficoltà
gli utenti meno esperti quando devono creare un output formattatto di un semplice numero, ad esempio stampare un importo in euro, con due
cifre decimali; ma anche buoni programmatori non trovano per niente agevole
stampare numeri in formati poco usuali come quello esponenziale.
printf è una funzione che cerca di sopperire a questa
mancanza, usando una sintassi simile a quella dell'omonima funzione del
C, ed è ormai presente in quasi tutti i linguaggi di programmazione.
Ad esempio, osserviamo la tabella che segue:
Nella prima colonna č riportato un numero fra 1 e 11;
i numeri di una sola cifra sono fatti precedere da uno 0.
Nella seconda vi è il logaritmo naturale del numero, formattato
con 5 cifre decimali. Nella terza colonna vi è l'esponenziale del
numero con 4 cifre decimali. Infine nell'ultima colonna vi è la
potenza, in base 12, del numero, stampata in forma esponeziale e con 4
cifre decimali.
La tabella è stata costruita interamente da script con la funzione
printf con quest'unica l'istruzione:
for (var i = 1; i < 12; i++)
printf(' %02d %8.5d %10.4d %5.4e \n', i, Math.log(i),
Math.exp(i), Math.pow(12, i));
Sintassi
La sintassi di
printf è la seguente:
printf("stringa di formato", variabile1,
variabile2, ...);
ovvero, dovendo stampare
n variabili, bisogna passare alla funzione
n + 1 parametri. Il primo parametro č la stringa di formato.
La stringa di formato può contenere qualsiasi carattere, oltre
ai caratteri necessari a formattare i parametri seguenti. Ad esempio,
con:
printf("Il risultato è: %5.2d\n",
result);
fornirà un output del tipo:
Il risultato è: 132.54
viene, cioè, stampata la stringa di formato; quando viene incontrato
il carattere "%", al suo posto viene stampato il corrispondente
parametro, secondo il formato specificato dopo il carattere.
Il modello generale del formato è il seguente:
%[ + | - ] [ 0 ] [ n [ .m] ] X
I parametri fra parentesi sono opzionali.
Il segno ( + o - ) definisce l'allineamento: con il segno
+ si ha l'allineamento a destra, con il - a sinistra. L'allineamento di
default è a destra ( + ) . Il carattere "|" è
l'OR (oppure) e sta a significare che i due segni non possono essere usati
contemporaneamente.
Lo "0" (zero) è il carattere di riempimento, utile
per i campi numerici. Quando il numero occupa uno spazio minore di quello
specificato nel formato, lo spazio rimanente viene riempito di spazi (default)
oppure da zeri (se specificato). Ad esempio, la stringa di formato "%03d" (3 caratteri a disposizone, riempiti da uno 0) applicata al numero 12 fornisce il risultato di 012.
Il numero n è il numero minimo di caratteri che devono essere
riservati al parametro da stampare. Il numeri di caratteri utilizzati
da un parametro potrebbe anche essere superiore ad n, se il parametro
li richiede. Ad esempio:
x = 1000;
printf("%2d", x);
occuperà 4 caratteri e non i 2 specificati nel formato.
Il punto seguito da un numero è necessario solo per i numeri decimali;
m rappresenta il numero di cifre da stampare dopo il punto decimale.
Ad esempio:
x = 1000.346;
printf("%6.2d", x);
stamperà il numero 1000.35. Si faccia attenzione che n rappresenta
il numero totale di caratteri riservati al parametro, compresi il punto
decimale e l'eventuale segno. in questo caso sono stati stampati 7 caratteri invece di 6.
Infine X rappresenta il tipo di grandezza da stampare e può essere:
- c carattere
- d numero decimale
- x numero, che verrā stampato in formato esadecimale
- o numero, che verrā stampato in formato ottale.
- e numero, che verrā stampato in formato esponenziale
- s stringa
Il carattere può essere sia minuscolo che maiuscolo.
Il carattere "\n" (new line) verrà convertito in "<BR>".
Per stampare i caratteri speciali (% e \) devono essere preceduti dal
segno "%". Quindi %% stamperà un semplice % e non verrà
considerato l'inizio di un formato.
Si tenga presente che, per avere effettivamente gli allineamenti desiderati,
bisogna utilizzare i caratteri a spaziatura fissa.
Esempi
Torniamo all'esempio della precedente tabella.
Per stampare il numero preceduto dallo 0 se ha meno di 2 cifre è
stata usata l'istruzione:
printf("%02d", i);
Come si vede il primo argomento di printf è una stringa (stringa
di formato) in cui %02d sta a significare che il numero successivo deve
essere stampato occupando 2 caratteri. Lo 0 iniziale indica che, nel caso
il numero occupi meno di 2 caratteri, il carattere mancante deve essere
riempito con uno 0.
La seconda colonna è stata stampata con:
printf("%8.5d", Math.log(i));
che significa: il logaritmo deve essere stampato occupando in totale 8
caratteri (compreso il punto decimale), di cui 5 per le cifre decimali.
Il numero, in realtà, occuperà solo 7 caratteri; il carattere
supplementare (uno spazio) verrà inserito all'inizio.
La terza colonna è stata stampata con:
printf("%10.4d", Math.exp(i));
dal significato analogo al precedente. Come si vede, però, il numero
viene allineato a destra, inserendo tanti spazi quanti sono necessari.
L'ultima colonna è stata stampata con:
printf("%5.4e", Math.pow(10,
i));
la "e" nella stringa di formato impone, appunto, la stampa in formato
esponenziale. L'esponente viene sempre stampato con il segno e tre caratteri
eventualmente rimpiti con lo "0". Il numero deve essere di almeno
5 caratteri in totale, di cui 4 decimali. È evidente che il numero
non potrà occupare solo 5 caratteri; il numero verrà stampato
senza spazi aggiuntivi per la formattazione.
In questo ulteriore esempio viene stampato il codice HTML per costruire
una tabella di nomi, allineando le stringhe a sinistra e i numeri a destra.
Ed è stato ottenuto con
var head = '<table class="tabella">';
var riga = '<tr>' +
'<td>%-10s</td>' +
'<td>%-10s</td>' +
'<td>Lire %d</td>' +
'<td>€ %5.2d</td>' + '</tr>';
var foot = '</table>';
var persone = new Array(
"Rossi", "Alberto", 18300,
"Bianchini", "Roberto", 32730,
"Franchi", "Giuseppe", 42750);
printf(head);
for (var i = 0; i < persone.length; i += 3)
printf(riga, persone[i], persone[i + 1],
persone[i + 2], persone[i + 2] / 1936.27);
printf(foot);
Lo stesso elenco, con gli stessi allineamenti poteva essere fatto senza
costruire la table:
con il più semplice script:
for (var i = 0; i < persone.length; i += 3)
printf("%-10s %-10s Lire: %5d\t€ %6.2d\n",
persone[i],
persone[i + 1], persone[i + 2], persone[i + 2] / 1936.27);
Quest'altro esempio mette in evidenza la facilitā con cui si possono
fare le conversioni di formato:
La tabella di destra riporta un numero decimale nella prima colonna, il
corrispondente esadecimale nella seconda e l'ottale nella terza. Č stata
costruita soltanto con le istruzioni:
for (var i = 10; i < 24; i += 2)
printf("%2d 0x%02x %03o\n", i, i, i);
E infine, dulcis in fundo, il grafico di una sinusoide:
Senza addendrarci nei particolari, la parte centrale dello script è:
for (var i = 0; i < n; i++) {
var x = wmax + values(i) * wmax / maxval;
printf('<tr><td>' + row + '</td></tr>', x, bgcol);
}
sprintf
sprintf() formatta una serie di parametri, analogamente a
printf,
ma, invece di stampare la stringa formattata, la riporta, cosicché
possa essere memorizzata in una stringa. Del tutto simile a printf(), ha
la seguente sintassi:
variabile = sprintf("stringa di formato",
parametro1, parametro2, ...);
Ad esempio:
function linkIt(str, url, target) {
return sprintf('<a href="%s" target="%s">%s</a>',
url, target, str);
}
a = "Clicca per continuare";
a = linkIt(a, "http://www.google.com", "newwin");