如何在delphi中将字符串剪切到所需的数字?

如何在delphi中将字符串剪切到所需的数字?,delphi,delphi-xe2,delphi-7,Delphi,Delphi Xe2,Delphi 7,我有一个数据库列,一个字符串只能包含40个字符。所以当字符串的长度大于40个字符时,它会给我带来错误。如何在delphi中将字符串剪切/修剪为40个字符 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' 更奇妙的是,如果字符串

我有一个数据库列,一个字符串只能包含40个字符。所以当字符串的长度大于40个字符时,它会给我带来错误。如何在delphi中将字符串剪切/修剪为40个字符

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'
更奇妙的是,如果字符串被截断,则添加省略号,以更清楚地表明这一点:

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 ...'
函数StrMaxLen(const S:string;MaxLen:integer):string;
变量
i:整数;
开始
结果:=S;

如果长度(结果)您可以为此作业使用
SetLength

SetLength(s, Min(Length(s), 40));
受此启发,我的解决方案是这样的(缩短可能很长的路径)

const
maxlen=77;//通过输入示例文本发现此问题
开始
headlineTemp:=提取文件名(main.DatabaseFileName);
如果长度(main.DatabaseFileName)>maxlen,则
开始
pnlDBNavn.标题:=
中段(
main.DatabaseFileName,1,
maxlen-3-长度(headlinetemp)
)+'…\'+headlineemp;
结束
其他的
//名称较短,所以只需显示它
pnlDBNavn.Caption:=main.DatabaseFileName;
结束;

我刚刚添加了这个。(当我看到您的答案时,这是一个未加说明的问题。)这是最好的方法,性能方面,如果您使用很长的字符串(许多MB)或非常多的字符串(每秒数千个左右)。我认为这是性能和编码方面最好的方法。对于非常长的字符串,它将分配一个新的内存块,因此不会比copy()快。因此,在本例中使用Setlength的imho过于复杂。Copy()将分配一个新字符串,但将使引用计数更直接,更标准。这段代码只是过早的优化。@ArnaudBouchez我个人没有提到优化。我不是在考虑表演。这就是我如何将字符串截断到特定的最大长度。我认为优化和性能在这里并不重要。见鬼,我们要把它推到数据库了。让我们把事情的轻重缓急安排好。顺便说一句,这有一个相当惊人的变化,那就是你指控我犯了阿宝。通常情况是相反的!;-)你需要
StrUtils
。我想知道,这比
SetLength
Copy
方法快吗?在内部,LeftStr执行一个Copy命令,所以它不快。关于DB列长度的部分真的与此相关吗?因为如果是这样,您可以在这里使用几种方法,例如设置字段大小将截断字符串,或者在查询本身中使用CAST/其他SQL字符串函数。。。(在这种情况下,我会重新考虑如何改进我的DB设计)。我建议在结尾使用适当的省略号字符,从而在字符串中保留两个额外的字符。@mj2008:添加了该选项。该字符在ANSI字符集中也是十六进制85(我在Delphi中使用了很多年)。显然,任何使用它的人都应该确保它在他们的代码页或其他任何地方是有效的。@mj2008:但是85美元超过127美元,所以不是特别安全。那么使用Unicode要安全得多。好吧,现在我看到大多数人都同意这个字符,但Unicode中的字符不一样,我们都需要Unicode。例如,如果在记事本中执行Alt+0133,则实际插入的字符为U+2026。
var s : string;
begin   
   s := 'your string with more than 40 characters...';
   s := LeftStr(s, 40);
SetLength(s, Min(Length(s), 40));