2009-07-17 109 views
13

Tôi đang cố gắng tìm ra cách để kiểm tra phần tử đầu tiên của chuỗi nếu đó là một số hay không.Cách lấy phần tử đầu tiên trong một chuỗi?

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

Vấn đề là tôi nhận được một lỗi "phần tử 0 không thể tiếp cận - sử dụng 'Length' hoặc 'setlength"

Một cách khác đến đầu tôi từ exprieince C giống như của tôi - chuyển đổi các yếu tố đầu tiên của chuỗi để char và kiểm tra char, nhưng không có sự khác biệt trong các lỗi biên dịch.

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

Làm cách nào để hoàn thành?

+0

BTW: loại trả về của biểu thức myString [1] đã là một Char để làm một diễn viên rõ ràng không phục vụ mục đích ở đây –

Trả lời

35

Strings được 1 dựa trên:

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

47 giây ... damn ...;) –

+0

Chỉ một vấn đề bây giờ là "loại không tương thích - chuỗi và số nguyên ". Nếu tôi sử dụng StrToInt và chuỗi không phải là một số nguyên thì một ngoại lệ sẽ được ném và tất cả các kiểm tra đó là vô ích. Bạn có đề xuất một cách tốt hơn không? +1 nhân tiện. :) –

+2

John, sử dụng TryStrToInt sau đó. – Pauk

8

Delphi dây sử dụng một chỉ số 1 có trụ sở, vì vậy chỉ cần viết lại để

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

Cũng lưu ý các dấu ngoặc kép quanh các 0..9, nếu không bạn sẽ so sánh các ký tự với số nguyên.

15

Chuỗi chỉ mục Pascal và Delphi từ 1. Đây là di sản từ thời gian không có byte có độ dài, trong khi 255 tiếp theo (chỉ mục 1 đến 255) chứa các ký tự thực. Joel Spolsky viết bài khá tốt về các vấn đề chuỗi:
http://www.joelonsoftware.com/articles/fog0000000319.html

+0

+1 để giải thích * tại sao * chúng là 1-based –

+0

Bài viết "Spolsky" nói về việc triển khai các chuỗi Pascal trong C mà không cần bất kỳ sự hỗ trợ trình biên dịch nào. Các vấn đề là không thích hợp cho các ngôn ngữ có hỗ trợ cho nó. –

+0

@Marco van de Voort: Tôi e rằng bạn đã hoàn toàn bỏ lỡ bài viết của Joel. – smok1

0

nếu không muốn nói (myString [0] trong [0..9]) sau đó // Do something

Nếu bạn sử dụng Delphi 2009, lớp TCharacter trong Character.pas có các chức năng như IsDigit để giúp đơn giản hóa các loại hoạt động này.

Sau khi bạn sửa chỉ mục, tất nhiên. :)

+2

Việc truyền tới Char() là không cần thiết, vì một chuỗi được tạo thành từ ký tự và chúng có thể được truy cập trực tiếp. Ngoài ra, so sánh của bạn sẽ là sai anyway, như Char ('0') là số thập phân 48 (hex 30), và do đó sẽ không rơi giữa 0 và 9. –

0

Cách đơn giản nhất để kiểm tra xem các ký tự đầu tiên của chuỗi là một số nguyên, và sau đó công văn:

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

Không, tôi không nghĩ đó là cách đơn giản nhất. John thực sự đã có ý tưởng đúng, nhưng đang dò dẫm xung quanh trong bóng tối cho cú pháp thích hợp. –

+0

Đúng, nhưng nếu bạn muốn hành động trên giá trị thì nó yêu cầu sử dụng StrtoInt. Nếu bạn sử dụng TryStrToInt bạn không chỉ có thể kiểm tra để xem nếu nó là một số, sau đó bạn có số để sau đó sử dụng. – skamradt

0

tôi sử dụng một chức năng tiện ích để kiểm tra toàn bộ chuỗi:

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; 

Đoạn mã trên dành cho các phiên bản Delphi trước năm 2007. Trong năm 2007 và 2009, bạn có thể thay đổi biến số nguyên i thành ký tự c và sử dụng cho c trong Giá trị thay thế.

Để kiểm tra chỉ số nguyên, hãy xóa '.' từ bộ ký tự để kiểm tra.

0

Điều này không đúng. Các chuỗi ISO và Pascal cũ hơn cũng bắt đầu tại một. Nó chỉ là một quy ước chung, và afaik của điều [0] là kết quả của việc bị bỏ trống, và rẻ tiền để mã trong trình thông dịch bytecode UCSD. Nhưng đó là chút cuối cùng là trước thời gian của tôi, vì vậy chỉ có tôi đoán.

Kết quả từ khả năng Pascal có giới hạn trên và dưới tùy ý, cung cấp nhiều mảng truy cập an toàn hơn.

Chuỗi Pascal thực sự cũ (cho đến đầu thập niên tám mươi) thậm chí còn tệ hơn cả chuỗi B btw.Nhiều quy ước đã được sử dụng, nhưng tất cả đều dựa trên các mảng tĩnh (như C sớm), nhưng chúng thường là đệm không gian, vì vậy bạn đã quét lại từ đầu cho đến khi các khoảng trống kết thúc.

(loại bỏ các thẻ di sản, vì là 1 căn cứ không phải là di sản. Truy cập s [0] như chiều dài LÀ di sản, nhưng đó không phải là những gì các câu hỏi là về)

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

Đừng quên trích dẫn giữa các chữ số.

4

Chúng ta nên lưu ý một số điều:

  1. String trong Delphi là 0-dựa cho các nền tảng di động và 1-dựa cho Windows.
  2. Chuỗi trong phiên bản cũ của Delphi là AnsiString (1 byte trên mỗi char) và WideString trong phiên bản mới (2 byte cho mỗi char).
  3. Delphi hỗ trợ thiết lập AnsiChar, nhưng không hỗ trợ bộ WideChar.

Vì vậy, nếu chúng ta muốn viết một mã tương thích với mọi phiên bản của Delphi, sau đó nó nên được một cái gì đó như thế này:

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

Với bản cập nhật sau đó để mã di động Delphi, chỉ số chuỗi dưới thay đổi từ 0 đến 1. Khi bạn biên dịch các chương trình cũ hơn, chúng biên dịch và chạy đúng bằng cách sử dụng chỉ mục 0 bắt đầu. Các chương trình được tạo với IDE sau sẽ tạo ra lỗi. Khi bạn có hỗn hợp, cuộc sống trở nên phức tạp! Nó có thể là tốt để có thể có một chương trình cũ hơn và nói với IDE rằng bạn muốn nó được cập nhật (có thể điều này sẽ sửa chữa những thứ khác, như phông chữ nhận được tranh giành khi bạn trả lời một cuộc gọi điện thoại!) Nhưng nó sẽ là tốt để có được những điều phù hợp!

Các vấn đề liên quan