2013-02-18 17 views
7

Bir dizenin yalnızca 40 karakterini alabilen bir veritabanı sütunum var. Dize uzunluğu 40 karakterden büyük olduğunda, bana hata veriyor. Delphi'de dizeyi 40 karaktere nasıl kesip/kesebilirim?Delphi'de istenen bir sayıya dize nasıl kesilir?

+6

burada gerçekten alakalı DB sütun uzunluğu hakkında bir parçası mı? çünkü eğer burada birkaç yaklaşımınız varsa, örneğin alanın ayarlanması dizgeyi kırpacak ya da sorguda bir CAST/diğer SQL string fonksiyonlarını kullanacaktır ... (Bu durumda DB tasarımımı nasıl geliştireceğimi düşünürdüm). – kobik

cevap

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' 

Daha fantezi bir dize kesilirse, üç nokta eklemek olacaktır bu daha net göstermek için:

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

Veya, tüm Unicode severler için, kullandığınız fazla iki kez daha özgün karakterleri tutabilir tek üç nokta karakteri ... (U + 2026: YATAY 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…' 

Ama sonra tüm kullanıcılar ve yakınları bu nadir karakteri destekleyen pozitif olmalıdır. Bu iş için

+0

Bunun için uygun elips karakterini kullanmanızı öneririm, böylece dizeye iki ek karakter daha eklenir. – mj2008

+0

@ mj2008: Bu seçeneği ekledi. –

+0

karakteri de ANSI karakter kümelerinde hex 85'dir (yıllarca Delphi'de kullandım). Açıkçası, onu kullanan herkes, kod sayfasında veya her neyse geçerli olduğundan emin olmalıdır. – mj2008

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

"StrUtils" için bu. –

+0

Evet, tabiki haklısın. StrUtils'i eklemelisin. –

+1

Merak ediyorum, bu 'SetLength' veya 'Copy' yaklaşımından daha mı hızlı? – Wodzu

13

kullanabilirsiniz SetLength :

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

Sadece bunu ekledim. (Yanıtınızı gördüğümde unaddediniz.) –

+2

Çok uzun dizelerle (birçok MB) veya çok fazla dizeyle (saniyede binlerce) çalışıyorsanız, bu en iyi yaklaşımdır. –

+0

Bu, en iyi yaklaşım performansı ve kodlama bilimi olduğunu düşünüyorum. –

İlgili konular