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
数据类型。