2013-02-18 14 views
7

Ho una colonna di database che può richiedere solo 40 caratteri di una stringa. Quindi, quando la lunghezza della stringa è maggiore di 40 caratteri, mi dà errore. Come posso tagliare/tagliare la stringa a 40 caratteri in delphi?Come tagliare una stringa ad un numero desiderato in delphi?

+6

è la parte su DB lunghezza della colonna davvero rilevante qui? perché se così fosse si possono avere diversi approcci qui, per esempio l'impostazione delle dimensioni del campo troncerà la stringa, o l'uso di una stringa CAST/altre funzioni SQL nella query stessa ... (Vorrei ripensare a come migliorare la progettazione del mio DB in questo caso). – kobik

risposta

18
var 
    s: string; 
begin 
    s := 'This is a string containing a lot of characters.' 
    s := Copy(s, 1, 40); 
    // Now s is 'This is a string containing a lot of cha' 

più fantasia sarebbe quella di aggiungere puntini di sospensione se una stringa viene troncato, per indicare più chiaramente:

function StrMaxLen(const S: string; MaxLen: integer): string; 
var 
    i: Integer; 
begin 
    result := S; 
    if Length(result) <= MaxLen then Exit; 
    SetLength(result, MaxLen); 
    for i := MaxLen downto MaxLen - 2 do 
    result[i] := '.'; 
end; 

var 
    s: string; 
begin 
    s := 'This is a string containing a lot of characters.' 
    s := StrMaxLen(S, 40) 
    // Now s is 'This is a string containing a lot of ...' 

Oppure, per tutti gli amanti Unicode, è possibile mantenere altri due personaggi originali utilizzando la singolo carattere puntini di sospensione ... (U + 2026: ORIZZONTALE eLLIPSIS):

function StrMaxLen(const S: string; MaxLen: integer): string; 
var 
    i: Integer; 
begin 
    result := S; 
    if Length(result) <= MaxLen then Exit; 
    SetLength(result, MaxLen); 
    result[MaxLen] := '…'; 
end; 

var 
    s: string; 
begin 
    s := 'This is a string containing a lot of characters.' 
    s := StrMaxLen(S, 40) 
    // Now s is 'This is a string containing a lot of ch…' 

Ma allora si deve essere positivo il fatto che tutti gli utenti ed i loro parenti sostengono questo personaggio non comune.

+0

Suggerirei di utilizzare il carattere di ellissi appropriato all'estremità per questo, mantenendo così due caratteri aggiuntivi nella stringa. – mj2008

+0

@ mj2008: aggiunta questa opzione. –

+0

il carattere è anche esadecimale 85 nei set di caratteri ANSI (l'ho usato in Delphi per molti anni). Ovviamente chiunque lo usi dovrebbe assicurarsi che sia valido nella propria pagina di codice o altro. – mj2008

12
var s : string; 
begin 
    s := 'your string with more than 40 characters...'; 
    s := LeftStr(s, 40); 
+4

Hai bisogno di 'StrUtils' per Questo. –

+0

sì, certo che hai ragione. devi aggiungere StrUtils. –

+1

Mi chiedo, è più veloce dell'approccio 'SetLength' o' Copy'? – Wodzu

13

È possibile utilizzare SetLength per questo lavoro:

SetLength(s, Min(Length(s), 40)); 
+0

L'ho appena aggiunto. (Non aggiustato che quando ho visto la tua risposta.) –

+2

Questo è l'approccio migliore, in termini di prestazioni, se lavori con stringhe molto lunghe (molti MB) o molte stringhe (migliaia al secondo circa). –

+0

Penso che questa sia la migliore prestazione di approccio e di codifica. –

Problemi correlati