Delphi 当字符串以非数字字符和前导零开头时,如何将字符串转换为整数?

Delphi 当字符串以非数字字符和前导零开头时,如何将字符串转换为整数?,delphi,Delphi,我有一些字符串是在运行时动态创建的 这些值以下划线、前导零和序列号的顺序生成。格式如下所示: _00001 _00002 _00003 _00004 _00098 _00099 _00100 _00101 我想将数字部分提取为整数,忽略下划线和前导零 StringReplace可以轻松删除下划线部分,但我无法知道值是什么,如何提取数字部分 此类功能如何工作的一些示例输出: \u 00003=3 \u 00098=98 \u 00482=482 \u 07218=721

我有一些字符串是在运行时动态创建的

这些值以下划线、前导零和序列号的顺序生成。格式如下所示:

_00001  
_00002  
_00003  
_00004

_00098  
_00099  
_00100  
_00101
我想将数字部分提取为整数,忽略下划线和前导零

StringReplace
可以轻松删除下划线部分,但我无法知道值是什么,如何提取数字部分

此类功能如何工作的一些示例输出:

\u 00003
=
3

\u 00098
=
98

\u 00482
=
482

\u 07218
=
7218

\u 14005
=
14005

\u 37585
=
37585

\u 69732
=
69732

StringReplace
Pos
是我的想法,但我并不总是确定如何充分利用
Pos
,而且
StringReplace
方法可能会很混乱

我想我所需要做的就是检查第一个不是0的数字,但可能我又把自己弄糊涂了,所以欢迎使用任何指针。

您应该使用

StrToInt(Copy(S, 2))

实际上,
Copy(S,2)
返回
S
中除第一个字符外的所有字符,因此您可以得到
00003
00098
00482
,等等。您可以使用
stroint
轻松地将这些字符转换为相应的整数。您可以使用这样的方法:

function YourTypeStrToInt(const StrNum: String): Integer;
begin
  Result := StrToInt(Trim(StrNum.Remove(0, 1)));
end;
对于旧的Delphi版本:

function YourTypeStrToInt(const StrNum: String): Integer;
var
  P: PChar;
begin
 P:=PChar(Trim(StrNum));
 Inc(P);
 Result:=StrToInt(P);
end;

前面的零应该被忽略。您是否尝试过stroint()?
stroint(Copy(S,2,MaxInt))
结果:=stroint(PChar(Trim(StrNum))+1+1+1,用于返回具有兼容示例的更新答案。为什么我从来不知道您可以排除
Copy
的第三个参数?在所有这些时间里,我输入
Copy(S,2,长度)
@Jerrydoge有趣的是,你提到这一点是因为Andreas answer中的代码在XE中工作,然后我在Lazarus中也尝试了,但失败了,除非你包括长度部分。出于某种原因,我喜欢保留长度的外观:)@FreeConsulting,本质上是的,但是
MaxInt
更好,因为它是常量,所以您不必费心在运行时确定字符串长度:-)@TLama,我同意。但是我说的是试图从字符串
S
中从第二个(!)字符开始复制
长度
字符。这总是会导致复制到字符串的末尾,就像尝试
复制
MaxInt
字符一样。@alcalde,你说得对。但是,在这种特殊情况下,如果您有一个长度超过2147483648位的字符串来表示一个数字,我怀疑您是否会有一个数字数据类型来存储该大数字,以进行
strotint
转换(它应该是大于
Int17179869184
的数据类型,保持位命名约定)。作为折衷方案,我建议使用一个常量,比如
MaxStr
,长度限制为
string
数据类型。