FUNFUNZIONE PRINTF

 

- printf -
by Maurizio Mauri
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:

  n.      log(n)        exp(n)         12n  

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 &egrave;: %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>&euro; %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&euro; %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");


scarica il file

HOME
 


RIZZI RENATO

renato@renatoweb.it