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?
risposta
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.
Suggerirei di utilizzare il carattere di ellissi appropriato all'estremità per questo, mantenendo così due caratteri aggiuntivi nella stringa. – mj2008
@ mj2008: aggiunta questa opzione. –
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
var s : string;
begin
s := 'your string with more than 40 characters...';
s := LeftStr(s, 40);
Hai bisogno di 'StrUtils' per Questo. –
sì, certo che hai ragione. devi aggiungere StrUtils. –
Mi chiedo, è più veloce dell'approccio 'SetLength' o' Copy'? – Wodzu
È possibile utilizzare SetLength
per questo lavoro:
SetLength(s, Min(Length(s), 40));
L'ho appena aggiunto. (Non aggiustato che quando ho visto la tua risposta.) –
Questo è l'approccio migliore, in termini di prestazioni, se lavori con stringhe molto lunghe (molti MB) o molte stringhe (migliaia al secondo circa). –
Penso che questa sia la migliore prestazione di approccio e di codifica. –
è 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