2009-07-17 99 views
13

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

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

的问题是,我得到一个错误“元素0不能存取 - 使用长度或SETLENGTH”

另一种方式来到我的脑袋从我的C类exprieince - 转换的第一要素字符串char和检查字符,但编译错误没有区别。

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

我该如何实现它?

+0

BTW:表达式myString [1]的返回类型已经是一个Char,所以做一个明确的演员在这里没有任何用处 – 2009-07-17 14:08:51

回答

35

字符串是基于1:

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

47秒...该死......;) – 2009-07-17 13:42:42

+0

现在只有一个问题“不兼容的类型 - 字符串和整数“。如果我使用StrToInt并且字符串不是整数,那么将抛出异常并且所有检查都是无用的。您能否提出更好的方法? +1顺便说一句。 :) – 2009-07-17 13:45:13

+2

约翰,然后使用TryStrToInt。 – Pauk 2009-07-17 13:51:05

8

德尔福字符串使用基于1的指数,所以才改写为

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

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

15

Pascal和Delphi从1开始索引字符串。这是从零字节包含长度的时间开始的遗留问题,而下一个255(索引1到255)包含实际字符。 乔尔斯波斯基写了一篇关于字符串的问题相当不错的文章:
http://www.joelonsoftware.com/articles/fog0000000319.html

+0

+1解释*为什么*它们是基于1的 – 2009-07-17 14:04:30

+0

“Spolsky”文章讨论了如何在没有任何编译器支持的情况下在C中实现Pascal字符串。这些问题与支持它的语言无关。 – 2009-07-17 19:57:01

+0

@Marco van de Voort:我担心你完全错过了Joel的文章。 – smok1 2009-07-17 21:07:12

0

如果不是(MyString的[0] [0..9]),那么//做一些

如果你使用Delphi 2009,Character.pas中的TCharacter类具有类似于IsDigit的功能来帮助简化这些类型的操作。

当然你一旦修好了索引。 :)

+2

对Char()的强制转换不是必须的,因为字符串由字符组成,并且可以直接访问它们。而且,无论如何,你的比较是错误的,因为Char('0')是十进制48(十六进制30),因此不会介于0和9之间。 – 2009-07-17 15:46:56

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;  
+1

不,我不认为这是最简单的方法。约翰实际上有正确的想法,但在黑暗中摸索适当的语法。 – 2009-07-17 19:25:51

+0

确实如此,但是如果您想要对该值采取行动,那么它需要使用StrtoInt。如果您使用TryStrToInt,您不仅可以检查是否有数字,然后您可以使用该数字。 – skamradt 2009-07-17 19:29:57

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中。

要仅测试整数,请删除'。'从一组字符中进行测试。

0

这是不正确的。 ISO字符串和更老的Pascal也从一开始。这只是一个通用的约定,而且这个s [0]是空缺的结果,而且在UCSD字节码解释器中编码很便宜。但最后一点在我的时间之前,所以只有我的猜测。

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

真正的老帕斯卡尔字符串(直到八十年代初)的字符串比C的顺便更糟。使用了多种约定,但都是基于静态数组(如早期的C),但它们通常是空间填充的,所以从末尾扫描直到空格结束。

(去除旧的标签,因为基于为1是不是遗产。访问S [0]长度的传统,但这不是问题是关于什么的)

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

不要忘了报价数字之间的数字。

4

我们应该记住一些事情:基于0

  1. 字符串在Delphi是移动平台和基于1的用于Windows。
  2. 旧版Delphi中的字符串是AnsiString(每字符1个字节),WideString(新字符每字符2字节)。
  3. Delphi支持集AnsiChar,但不支持集WideChar

因此,如果我们想要写与德尔福的所有版本兼容的代码,那么就应该是这样的:

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

随着后续更新德尔福移动代码,底部串指数变化0到1.编译较旧的程序时,它们使用0起始索引编译并正确运行。使用更高版本的IDE创建的程序会产生错误。当你有混合,生活变得复杂!

这将是一件好事,能够采取一个较旧的程序,并告诉IDE,你希望它带来最新的(也许这会解决其他的事情,比如当你接听电话时字体变得混乱!),但它将事情保持一致是很好的!

相关问题