2009-07-17 63 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,你希望它帶來最新的(也許這會解決其他的事情,比如當你接聽電話時字體變得混亂!),但它將事情保持一致是很好的!

相關問題