2013-02-18 12 views
7

Ich habe eine Datenbankspalte, die nur 40 Zeichen einer Zeichenfolge dauern kann. Wenn also die Länge der Zeichenfolge größer als 40 Zeichen ist, gibt es einen Fehler. Wie kann ich die Zeichenkette in Delphi auf 40 Zeichen schneiden/trimmen?Wie schneidet man eine Zeichenfolge in Delphi auf eine gewünschte Zahl?

+6

Ist der Teil über DB Spaltenlänge wirklich relevant hier? Wenn das der Fall ist, können Sie mehrere Ansätze haben, zum Beispiel wird durch das Setzen der Feldgröße die Zeichenfolge abgeschnitten oder eine CAST/andere SQL-String-Funktion in der Abfrage selbst verwendet ... (Ich würde in diesem Fall überdenken, wie ich mein DB-Design verbessern könnte)). – kobik

Antwort

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' 

Mehr Phantasie wäre Auslassungs hinzufügen, wenn eine Zeichenfolge abgeschnitten wird dies deutlicher zeigen:

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 ...' 

Oder für alle Unicode-Liebhaber, können Sie zwei weitere Original Zeichen halten, indem sie die Verwendung von Einzelauslassungs Charakter ... (U + 2026: Horizontale Auslassungs):

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…' 

Aber dann müssen Sie positiv sein, dass alle Benutzer und ihre Angehörigen dieses ungewöhnlichen Charakter unterstützen.

+0

Ich würde vorschlagen, das richtige Ellipsenzeichen am Ende dafür zu verwenden und so zwei zusätzliche Zeichen in der Zeichenfolge zu behalten. – mj2008

+0

@ mj2008: Diese Option hinzugefügt. –

+0

das Zeichen ist auch hex 85 in den ANSI-Zeichensätzen (ich habe es in Delphi seit vielen Jahren verwendet). Offensichtlich sollte jeder, der es verwendet, sicherstellen, dass es in seiner Codepage oder was auch immer gültig ist. – mj2008

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

Sie brauchen 'StrUtils' für Dies. –

+0

ja, natürlich hast du recht. Sie müssen StrUtils hinzufügen. –

+1

Ich frage mich, ist das schneller als 'SetLength' oder' Copy' Ansatz? – Wodzu

13

Sie SetLength für diesen Job verwenden können:

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

Ich habe das gerade hinzugefügt. (Unaddiert, wenn ich deine Antwort gesehen habe.) –

+2

Dies ist der leistungsmäßig beste Ansatz, wenn Sie mit sehr langen Strings (viele MBs) oder sehr vielen Strings (Tausende pro Sekunde oder so) arbeiten. –

+0

Ich denke, das ist der beste Ansatz Leistung und Codierung. –