2013-02-18 33 views
7

Tôi có một cột cơ sở dữ liệu có thể chỉ lấy 40 ký tự của một chuỗi. Vì vậy, khi độ dài của chuỗi lớn hơn 40 ký tự, nó cho tôi lỗi. Làm thế nào tôi có thể cắt/cắt chuỗi thành 40 ký tự trong delphi?Làm thế nào để cắt một chuỗi thành một số mong muốn trong delphi?

+6

là phần về chiều dài cột DB thực sự liên quan ở đây? vì nếu bạn có thể có một số cách tiếp cận ở đây, ví dụ thiết lập kích thước trường sẽ cắt xén chuỗi, hoặc sử dụng một hàm chuỗi CAST/khác trong truy vấn ... (Tôi sẽ suy nghĩ về cách cải thiện thiết kế DB của mình trong trường hợp này). – kobik

Trả lời

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' 

More ưa thích sẽ có thêm ellipsis nếu một chuỗi được cắt ngắn, để cho biết điều này rõ ràng hơn:

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

Hoặc, cho tất cả những người yêu thích Unicode, bạn có thể giữ thêm hai nhân vật ban đầu bằng đơn nhân vật ellipsis ... (U + 2026: NGANG 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…' 

Nhưng sau đó bạn phải là số dương rằng tất cả người dùng của bạn và người thân của họ hỗ trợ nhân vật hiếm này.

+0

Tôi sẽ đề nghị sử dụng ký tự dấu chấm lửng thích hợp ở cuối cho điều này, do đó giữ hai ký tự bổ sung trong chuỗi. – mj2008

+0

@ mj2008: Đã thêm tùy chọn đó. –

+0

nhân vật cũng là hex 85 trong bộ ký tự ANSI (tôi đã sử dụng nó trong Delphi trong nhiều năm). Rõ ràng bất cứ ai sử dụng nó nên đảm bảo rằng nó là hợp lệ trong trang mã của họ hoặc bất cứ điều gì. – mj2008

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

Bạn cần 'StrUtils' cho điều này. –

+0

vâng, tất nhiên bạn nói đúng. bạn phải thêm StrUtils. –

+1

Tôi tự hỏi, điều này có nhanh hơn phương pháp 'SetLength' hoặc' Copy' không? – Wodzu

13

Bạn có thể sử dụng SetLength cho việc làm này:

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

Tôi vừa thêm nó. (Unadded rằng khi tôi nhìn thấy câu trả lời của bạn.) –

+2

Đây là cách tiếp cận tốt nhất, hiệu suất-khôn ngoan, nếu bạn làm việc với các chuỗi rất dài (nhiều MB) hoặc rất nhiều chuỗi (hàng ngàn mỗi giây hoặc lâu hơn). –

+0

Tôi nghĩ rằng đây là hiệu suất tiếp cận tốt nhất và mã hóa khôn ngoan. –

Các vấn đề liên quan