Albert Einstein: ... la nostra conoscenza, se paragonata alla realta' e' primitiva e infantile. Eppure e' il bene piu' grande che possediamo.
... all our science, measured against reality, is primitive and childlike-and yet it is the most precious thing we have.
Informatica : Code snippets (Strings)
Formattazione con riempimento a destra
A volte e' necessario (per reports, visualizzazioni incolonnate etc..) formattare una stringa in modo che la sua lunghezza sia fissa e non dettata dal contenuto corrente. Per fare un esempio, si deve produrre un output su file producendo righe in cui le informazioni abbiano una lunghezza fissa, come questa:
Nome (20 chars) |citta (20 chars) ----------------------------------------- Gianni--------------|Roma---------------- Alberto-------------|Milano--------------
Volendo appoggiare le stringhe a sinistra in uno 'spazio' di 20 caratteri, si ha bisogno di una funzione che, qualunque sia la lunghezza corrente della stringa, la porti al valore desiderato, aggiungendo a destra i caratteri necessari.
Nel codice sotto listato, implementiamo una funzione che svolga questo compito. La funzione riceve la stringa da 'formattare', la lunghezza L desiderata, e il carattere C di riempimento a destra. Ritornera' una stringa di lunghezza L, eventualmente 'completata' a destra da una sequenza di caratteri C. Chiamiamo questa funzione 'fillRight'.
Linguaggio: PASCAL
Parametri : s = stringa da formattare : wdt = ampiezza richiesta : cha = carattere di riempimento a destra Ritorna : Il contenuto iniziale della stringa s : seguita dal carattere 'cha' : ripetuto tante volte, fino : al raggiungimento della lunghezza 'wdt' Commenti : Nella implementazione vengono usate due : funzioni gia' codificate, Trim() e Replicate() : Trim() : Replicate()
{ Versione per short string (max 255 chars) e lunghezza corrente nel primo byte } function fillRight(S:String; Wdt:INTEGER; Cha:Char); VAR Spazio : INTEGER; len : Byte ABSOLUTE s; { absolute indica che la variabile len non viene 'allocata' , ma si sovrappone al byte in posizione 0 della stringa, quindi contiene la lunghezza della stringa stessa } BEGIN
Trim(s); { ripuliamo la sringa a destra e sinistra}
IF Wdt>0 THEN BEGIN { se non e' vuota }
{ quanto manca ad arrivare a wdt ? } Spazio:=Wdt-Len;
IF Spazio=0 THEN BEGIN { se non manaca niente non facciamo niente } END ELSE IF Spazio<0 THEN BEGIN
{ se e' piu' lunga di quanto richiesto prendiamo i primi wdt caratteri }
S:=Copy(S,1,Wdt);
END ELSE BEGIN
{ accodiamo il carattere 'CHA' ripetuto 'Spazio' volte per raggiungere una lunghezza di wdt caratteri }
S:= S + Replicate(Cha,Spazio);
END; END; fillLeft := S; END;
Linguaggio: Assembler 80286
Parametri : s = stringa da formattare : wdt = ampiezza richiesta : cha = carattere di riempimento a destra Ritorna : Il contenuto iniziale della stringa s : seguita dal carattere 'cha' : ripetuto tante volte, fino : al raggiungimento della lunghezza 'wdt' : N.B. Il codice e' scritto in forma : di procedura, non di funzione, : il parametro S e' passato 'per nome' : (per reference). Commenti : Questa versione assembler, e' scritta : con le convenzioni : usate nell'object pascal di Borland (c), : per interfacciare : codice Pascal con codice Assembler. : N.B. In piu' presuppone che la stringa : sia SHORT; max 255 caratteri : e nel primo byte : la lunghezza corrente : della stringa stessa. :
;PROCEDURE FillRight(VAR S:String; Wdt:integer; Cha:Char); ; fillrS EQU DWORD PTR [BP+10] fillrwdt EQU BYTE PTR [BP+8] fillrCha EQU BYTE PTR [BP+6] ; ; fillright PROC FAR ; PUSH BP MOV BP,SP PUSH DS ; ; ; LDS SI,fillrS CLD LODSB MOV CL,AL XOR CH,CH CMP CL,fillrwdt JB RIEMPI ; wdt > len accoda JE FINE2 ; wdt=len lascia andare.. MOV AL,fillrwdt ; wdtlen=wdt LES DI,fillrS STOSB JMP FINE2 RIEMPI: MOV AH,fillrwdt SUB AH,AL CLD REP LODSB PUSH DS POP ES PUSH SI POP DI MOV CL,AH MOV AL,fillrCha REP STOSB LES DI,fillrS MOV AL,fillrwdt STOSB FINE2: POP DS MOV SP,BP POP BP RET 8 fillright ENDP
Linguaggio: C#
Parametri : s = stringa da formattare : wdt = ampiezza richiesta : cha = carattere di riempimento a destra Ritorna : Il contenuto iniziale della stringa s : seguita dal carattere 'cha' : ripetuto tante volte, fino : al raggiungimento della lunghezza 'wdt' : Commenti : In C# (implementazione : Microsoft dotNet Framework (c) ) : esiste gia' un metodo della classe System.String : che implementa quanto richiesto. : Il nome del metodo e' PadRight() : Es.: : string s = "gianni"; : : s = s.PadRight(10,':'); : : // s = "gianni::::::::::". : :----------------- : : Segue una implementazione di fillRight in C# : Nella implementazione viene usata una : funzioni gia' codificate, replicate() : Replicate() :
public string fillRight(string s, int wdt, char cha) {
int spazio = 0;
s = s.Trim();
if (wdt>0) {
spazio = wdt - s.Length;
if (spazio==0) { } else if (spazio<0) {
s = s.Substring(0,wdt);
} else {
s += replicate(cha,spazio);
} }
return (s); }
N.B. Borland , DotNet e Microsoft sono marchi registrati ed appartengono ai leggittimi proprietari.
Metti la scheda negli appuntiVisualizza appuntiAzzera appunti