如何删除最后一个字符

9

如何使用 substring 或其他方式删除字符串的最后一个字符?

例如:

var
  query : String;
begin
  query:= 'test=1&line=5&'; 
end;

输出必须是:
query -> test1&line=5

11
SetLength(query, Length(query)-1); 的意思是将变量 query 的长度减少 1。 - LU RD
5个回答

19

第三个选择是这个:

SetLength(Query,LENGTH(Query)-1)

1
+1 - 这直接而简洁地实现了所需的效果。它“完全按照说明书操作”,最大程度地减少了误解或实现错误的机会。 - Deltics

11

试试这个:

var
  query : String;
begin
  query:= 'test=1&line=5&';
  delete(query,length(query),1);

@RemyLebeau:实际上,DELETE和INSERT过程(以及COPY函数)始终是基于1的,如果我没记错的话。唯一不同的部分是直接索引字符串表达式中的字符,即s [1]将是桌面编译器上的第一个字符,但在移动编译器上将是第二个字符。 - HeartWare
仅对上面的s[x]注释进行更新:在当前版本的Delphi中,s [1]将是所有PASCAL编译器版本中的第一个字符。 - HeartWare

10

我认为我会将其写成:

NewValue := OldValue.Substring(0, OldValue.Length - 1);

我认为函数接口,也就是返回新值的函数,通常比具有副作用的过程更可取。我发现赋值运算符是表明正在将新值分配给变量的明确指示器。使用函数方法使得在想要将新值存储在不同于原始值的变量中时,语法更加清晰简洁。


1
我同意David Heffernan的观点。他的回答和推理展示并解释了一种更好的从字符串中删除字符的方法。 - Mike Jablonski
1
对于旧版本,可以使用以下代码:Copy(str, 1, length(str)-1) - EProgrammerNotFound
@EProgrammerNotFound 或 LeftStr。但是,我假设使用的是XE3或更高版本。 - David Heffernan
3
在XE3及以上版本中,你可以使用TStringHelper.Remove()来替代,例如:query.Remove(query.Length-1) - Remy Lebeau
SetLength()不是具有副作用的过程,而是具有一个非常直接的效果的过程。 OP的要求是缩短现有字符串,而不是创建较短的副本。通过制造赋值来实现这一点既具有误导性,又不必要地冗长,并且涉及一个进一步未受限制的参数,具有潜在的意外错误。 在我看来,这种方法显然更有可能导致实现和/或随后的解释/修改中的错误。 - Deltics
显示剩余3条评论

0

我原本打算将这个方法用于另一个问题,名为“从字符串中删除最后5个字符”,虽然这可能不是最好的方法,但对于简单的字符串来说它是有效的,因为#0表示字符串的终止。

以你的例子为例:

Query[Length(Query)]:= #0;

对于我无法回复的其他主题示例

str[Succ(Length(str)) - 5]:= #0;
showmessage(str);

附言:我会投票支持 HeartWare 的答案,因为那是更可接受的做法。我只是展示了一个简单字符串的快速替代方案,可以产生期望的效果(主要是针对删除最后5个字符的其他主题)。


0
var
test: System.String;
begin
  test := 'Sample Text To Delete Last Character;!';
  test := Copy(test,1,length(test)-1);
  ShowMessage(test);
end;

变量已经建立;
一个样本文本被提供给变量;
变量在复制命令中引用自身,
复制命令通过从索引1(长度)-1处复制变量字符串的长度来将其返回给变量本身;
消息用于显示结果;

结果将是没有感叹号的文本; // 要删除最后一个字符的示例文本;


由于问题明确要求知道如何完成此操作,因此您应该包含一些注释来解释代码的作用以及为什么您认为它最好地解决了这个问题。 - ishmaelMakitla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接