2013-02-18 10 views
7

Mam kolumnę bazy danych, która może mieć tylko 40 znaków ciągu. Więc gdy długość łańcucha jest większa niż 40 znaków, daje mi błąd. Jak mogę wyciąć/przyciąć ciąg do 40 znaków w delphi?Jak wyciąć ciąg znaków do wybranej liczby w delphi?

+6

Czy część o długości kolumny DB naprawdę istotne tutaj? ponieważ jeśli jest to możliwe, możesz mieć kilka podejść tutaj, na przykład ustawienie rozmiaru pola spowoduje obcięcie łańcucha lub użycie funkcji łańcuchowych CAST/innych SQL w samym zapytaniu ... (Chciałbym przemyśleć, jak poprawić mój projekt bazy danych w takim przypadku). – kobik

Odpowiedz

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' 

bardziej wymyślne byłoby dodać wielokropek jeśli ciąg jest obcinany, aby wskazać to jaśniej:

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

Albo, dla wszystkich miłośników Unicode, można zachować jeszcze dwa oryginalne znaki przy użyciu pojedynczy znak wielokropka ... (U + 2026: poziomy wielokropek):

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

Ale wtedy musisz być pewny, że wszyscy użytkownicy i ich krewni obsługiwać tę niezwykłą postać.

+0

Proponuję użyć odpowiedniego znaku wielokropka na końcu tego, pozostawiając w ten sposób dwa dodatkowe znaki w łańcuchu. – mj2008

+0

@ mj2008: Dodano tę opcję. –

+0

Postać jest także w postaci heksadecymalnej 85 w zestawach znaków ANSI (używam jej w Delphi od wielu lat). Oczywiście każdy, kto go używa, powinien upewnić się, że jest poprawny na stronie kodowej lub cokolwiek innego. – mj2008

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

Potrzebujesz 'StrUtils' dla to. –

+0

tak, oczywiście, że masz rację. musisz dodać StrUtils. –

+1

Zastanawiam się, czy jest to szybsze niż podejście "SetLength" lub "Copy"? – Wodzu

13

SetLength Można użyć do tego zadania:

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

Właśnie to dodałem. (Unadded, kiedy widziałem twoją odpowiedź.) –

+2

To jest najlepsze podejście, jeśli chodzi o wydajność, jeśli pracujesz z bardzo długimi łańcuchami (wiele MB) lub bardzo wieloma ciągami (tysiące na sekundę). –

+0

Myślę, że jest to najlepsze podejście do podejścia i kodowanie. –