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?
Odpowiedz
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ć.
Proponuję użyć odpowiedniego znaku wielokropka na końcu tego, pozostawiając w ten sposób dwa dodatkowe znaki w łańcuchu. – mj2008
@ mj2008: Dodano tę opcję. –
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
var s : string;
begin
s := 'your string with more than 40 characters...';
s := LeftStr(s, 40);
Potrzebujesz 'StrUtils' dla to. –
tak, oczywiście, że masz rację. musisz dodać StrUtils. –
Zastanawiam się, czy jest to szybsze niż podejście "SetLength" lub "Copy"? – Wodzu
SetLength
Można użyć do tego zadania:
SetLength(s, Min(Length(s), 40));
Właśnie to dodałem. (Unadded, kiedy widziałem twoją odpowiedź.) –
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ę). –
Myślę, że jest to najlepsze podejście do podejścia i kodowanie. –
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