如何获取字符串中的第一个元素?

时间:2009-07-17 13:39:18

标签: delphi string

我正在试图找出一种方法来检查字符串的第一个元素,如果它是一个数字或不是。

if not(myString[0] in [0..9]) then //Do something

问题是我收到错误“元素0无法访问 - 使用'长度'或'SetLength”

另一种方式来自我的C-like exprieince - 将字符串的第一个元素转换为char并检查char,但编译错误没有区别。

if not(char(myString[0]) in [0..9]) then //Do something

我如何完成它?

10 个答案:

答案 0 :(得分:38)

字符串是从1开始的:

if not (myString[1] in ['0'..'9']) then // Do something

答案 1 :(得分:15)

Pascal和Delphi从1开始索引字符串。这是从零字节包含长度的时间遗留下来的,而下一个255(索引1到255)包含实际字符。 Joel Spolsky写了很多关于字符串问题的文章:
http://www.joelonsoftware.com/articles/fog0000000319.html

答案 2 :(得分:8)

Delphi字符串使用基于1的索引,因此只需重写

if not(myString[1] in ['0'..'9']) then //Do something

还要注意0..9周围的引号,否则你会将字符与整数进行比较。

答案 3 :(得分:5)

我们应该记住一些事情:

  1. Delphi中的字符串对于移动平台是基于0的,对于Windows是基于1的。
  2. 旧版Delphi中的字符串是AnsiString(每个字符1个字节)和新版本中的WideString(每个字符2个字节)。
  3. Delphi支持AnsiChar集,但不支持WideChar集。
  4. 因此,如果我们想编写一个与所有版本的Delphi兼容的代码,那么它应该是这样的:

    if (myString[Low(myString)]>='0') and (myString[Low(myString)]<='9') then
      // Do something
    

答案 4 :(得分:1)

  

如果不是([0..9]中的myString [0])则//执行某些操作

如果你正在使用Delphi 2009,Character.pas中的TCharacter类具有像IsDigit这样的函数来帮助简化这些操作。

当然,修复索引后。 :)

答案 5 :(得分:1)

随后对Delphi移动代码进行更新,底部字符串索引从0更改为1.编译旧程序时,使用0起始索引编译并正确运行。使用更高版本的IDE创建的程序会产生错误。当你有混合物时,生活变得复杂!

能够接受一个较旧的程序并告诉IDE你想要它更新是很好的(也许这会解决其他问题,比如当你接听电话时字体变得混乱!)但它会善于把事情保持一致!

答案 6 :(得分:0)

检查字符串的第一个字符是否为整数,然后调度的最简单方法:

var
  iResult : integer;
begin
  if TryStrToInt( mySTring[1], iResult) then
    begin
      // handle number logic here iResult = number
    end
  else
    begin
      // handle non number logic here
    end;
end;    

答案 7 :(得分:0)

我使用实用程序函数来测试整个字符串:

function IsNumeric(const Value: string): Boolean;
var
  i: Integer;
begin
  Result := True;
  for i := 1 to Length(Value) do
    if not (Value[i] in ['0'..'9','.','+','-']) then
    begin
      Result := False;
      Break;
    end;
end;

以上代码适用于2007年之前的Delphi版本。在2007年和2009年,您可以将整数变量i更改为字符c,并在值中使用c代替。

要仅测试整数,请删除“。”从要测试的字符集开始。

答案 8 :(得分:0)

这是不正确的。 ISO字符串和旧的Pascal也从一开始。这只是一个普遍的惯例,并且af [0]的结果是空置的结果,并且在UCSD字节码解释器中代码便宜。但最后一点是在我的时间之前,所以只有我的猜测。

它来自Pascal具有任意上限和下限的能力,这提供了更多类型安全访问数组。

真正古老的Pascal字符串(直到八十年代初)字符串甚至比C字符串还差。使用了多个约定,但所有约定都基于静态数组(如早期C),但它们通常是空间填充的,因此您从末尾扫描回到空格结束。

(删除旧版标记,因为基于1是遗留的。访问s [0]作为遗留长度的遗留问题,但这不是问题所在。)

答案 9 :(得分:0)

Foreach element in strName
  if not element in [0-9] then
     do something 
  else
    element is a digit
end if

不要忘记数字编号之间的引用。