【问题标题】:How to cut a string to some desired number in delphi?如何在delphi中将字符串剪切为某个所需的数字?
【发布时间】:2013-02-18 12:26:58
【问题描述】:

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

【问题讨论】:

  • 关于 DB 列长度的部分在这里真的相关吗?因为如果是这样,你可以在这里有几种方法,例如设置字段大小将截断字符串,或者在查询本身中使用 CAST/其他 SQL 字符串函数......(在这种情况下,我会重新考虑如何改进我的数据库设计)。

标签: delphi delphi-xe2 delphi-7


【解决方案1】:
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 ...'

或者,对于所有 Unicode 爱好者,您可以通过使用单个省略号字符来保留另外两个原始字符……(U+2026: HORIZONTAL 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…'

但是你必须肯定你的所有用户和他们的亲戚都支持这个不常见的角色。

【讨论】:

  • 我建议在末尾使用适当的省略号字符,从而在字符串中保留两个额外的字符。
  • @mj2008:添加了该选项。
  • 该字符在 ANSI 字符集中也是十六进制 85(我在 Delphi 中使用了很多年)。显然,任何使用它的人都应该确保它在他们的代码页或其他内容中有效。
  • @mj2008:但是 85 美元超过了 127 美元,因此不是特别安全。那么使用 Unicode 会更安全。
  • 好的,现在我看到大多数人都同意这个字符,但它在 Unicode 中相同,无论如何我们都需要 Unicode。例如,如果您在记事本中执行 Alt+0133,则实际插入的字符是 U+2026。
【解决方案2】:

您可以使用SetLength 来完成这项工作:

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

【讨论】:

  • 我刚刚添加了那个。 (当我看到你的答案时,没有添加。)
  • 如果您使用非常长的字符串(很多 MB)或非常多的字符串(每秒数千个左右),这是性能方面的最佳方法。
  • 我认为这是性能和编码方面最好的方法。
  • 对于很长的字符串,它会分配一个新的内存块,所以它不会比 copy() 快。所以恕我直言,在这种情况下使用 Setlength 只是过于复杂了。 Copy() 将分配一个新字符串,但会使引用计数更加直接,并且更加标准。这段代码只是过早的优化。
  • @ArnaudBouchez 我个人对优化只字未提。我没有考虑性能。这就是我将字符串截断为特定最大长度的方式。我认为优化和性能在这里并不重要。哎呀,我们即将把它推到数据库中。让我们按顺序排列优先事项。顺便说一句,这是一个相当令人惊讶的变化,即你指责我是 PO。通常情况是相反的! ;-)
【解决方案3】:
var s : string;
begin   
   s := 'your string with more than 40 characters...';
   s := LeftStr(s, 40);

【讨论】:

  • 你需要StrUtils
  • 我想知道,这比SetLengthCopy 方法快吗?
  • 内部 LeftStr 执行 Copy 命令,所以并不快。
【解决方案4】:

solution in java 启发,我的解决方案是这样的(缩短可能很长的路径)

   const
      maxlen = 77;   // found this by entering sample text

  begin
     headlineTemp := ExtractFileName(main.DatabaseFileName);
     if length(main.DatabaseFileName) > maxlen then
      begin
        pnlDBNavn.Caption :=
             MidStr(
                  main.DatabaseFileName, 1,
                           maxlen -3 - length(headlinetemp)
                ) + '...\' + headlineTemp;
      end
     else
         // name is shorter, so just display it
         pnlDBNavn.Caption := main.DatabaseFileName;
   end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2014-05-26
    • 2011-11-19
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多