2009-07-17 9 views
13

Ich versuche einen Weg zu finden, das erste Element einer Zeichenkette zu prüfen, ob es eine Zahl ist oder nicht.Wie erhält man das erste Element in einer Zeichenfolge?

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

Das Problem ist, dass ich einen Fehler „Element 0 nicht zugänglich - Verwendung‚Länge‘oder‚SetLength“an den Kopf

Ein anderer Weg, kam von meiner C-wie exprieince - wandeln das erste Element die zu char zu chartern und das char zu überprüfen, aber es gibt keinen Unterschied in den Kompilierungsfehlern.

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

Wie erreiche ich das?

+0

BTW: der Rückgabetyp des Ausdrucks myString [1] ist bereits ein Char, so dass eine explizite Besetzung hier keinen Zweck erfüllt –

Antwort

35

Strings sind 1-basiert:

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

47 Sekunden ... verdammt ...;) –

+0

Nur ein Problem jetzt "inkompatible Typen - String und Ganzzahl ". Wenn ich StrToInt benutze und der String keine ganze Zahl ist, wird eine Exception geworfen und diese Kontrolle ist nutzlos. Können Sie einen besseren Weg vorschlagen? +1 übrigens. :) –

+2

John, benutze TryStrToInt dann. – Pauk

8

Delphi Strings einen 1-basierten Index verwenden, so umschreiben, nur um

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

außerdem Kenntnis der Zitate nehmen um die 0..9, sonst würden Sie Vergleiche Zeichen mit ganzen Zahlen.

15

Pascal und Delphi indiziert String von 1. Dies ist ein Vermächtnis aus der Zeit, in der 0 Byte Länge enthielt, während die nächsten 255 (Index 1 bis 255) tatsächliche Zeichen enthielten. Joel Spolsky schrieb ziemlich guten Artikel über String Fragen:
http://www.joelonsoftware.com/articles/fog0000000319.html

+0

+1 für die Erklärung * warum * sie sind 1-basiert –

+0

Der "Spolsky" Artikel spricht über die Implementierung von Pascal-Strings in C ohne Compiler-Unterstützung. Die Probleme sind irrelevant für Sprachen, die Unterstützung dafür haben. –

+0

@Marco van de Voort: Ich fürchte, Sie haben Joels Artikel völlig vermisst. – smok1

0

wenn nicht (myString [0] in [0..9]) then // Tun Sie etwas

Wenn Sie Mit Delphi 2009 bietet die TCharacter-Klasse in Character.pas Funktionen wie IsDigit, um diese Operationen zu vereinfachen.

Sobald Sie die Indexierung natürlich reparieren. :)

+2

Die Umwandlung in Char() ist nicht notwendig, da eine Zeichenkette aus Zeichen besteht und direkt darauf zugegriffen werden kann. Außerdem wäre Ihr Vergleich sowieso falsch, da Char ('0') dezimal 48 (hex 30) ist und daher nicht zwischen 0 und 9 liegt. –

0

Der einfachste Weg, um zu prüfen, ob das erste Zeichen der Zeichenkette eine ganze Zahl ist, und dann Dispatch:

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

Nein, ich denke nicht, dass das der einfachste Weg ist. John hatte eigentlich die richtige Idee, tüftelte aber im Dunkeln nach der richtigen Syntax. –

+0

Stimmt, aber wenn Sie auf den Wert einwirken wollten, dann war die Verwendung von "StromoInt" erforderlich. Wenn Sie TryStrToInt verwenden, können Sie nicht nur prüfen, ob es eine Nummer ist, Sie haben dann die Nummer, die Sie dann verwenden können. – skamradt

0

verwende ich eine Nutzenfunktion die gesamte Zeichenfolge zu testen:

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; 

Der obige Code ist für Delphi-Versionen vor 2007. In 2007 und 2009 könnten Sie die Integer-Variable i in ein Zeichen c ändern und stattdessen für c in Value verwenden.

Um nur auf Ganzzahlen zu testen, entfernen Sie das '.' aus der Menge der zu testenden Zeichen.

0

Dies ist falsch. ISO-Strings und ältere Pascal's begannen ebenfalls bei eins. Es ist nur eine allgemeine Konvention, und afaik das s [0] Ding ist ein Ergebnis davon, dass das frei ist, und billig in den UCSD Bytecode-Interpreter zu kodieren. Aber das letzte bisschen ist vor meiner Zeit, also nur mein Raten.

Es ergibt sich aus der Pascal-Fähigkeit, beliebige obere und untere Grenzen zu haben, was für mehr Artensicherheitszugriffsarrays sorgt.

Wirklich alte Pascal Saiten (bis Anfang der achtziger Jahre) Saiten waren sogar schlechter als C diejenigen BTW.Es wurden mehrere Konventionen verwendet, aber alle basierten auf statischen Arrays (wie früher C), aber sie waren normalerweise gepolstert, sodass Sie vom Ende bis zum Ende der Leerzeichen zurückgescannt wurden.

(der Vermächtnis-Tag entfernt, da auf Basis 1 zu sein, ist nicht Erbe. Zugriff auf s [0] als Länge IST Erbe, aber das ist nicht das, was die Frage nach ist)

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

Sie das nicht vergessen Zitat zwischen Ziffern Nummer.

4

Wir daran, einige Dinge halten sollten:

  1. String in Delphi ist 0-basiert für mobile Plattformen und 1-basierten für Windows.
  2. Zeichenfolge in alten Versionen von Delphi ist AnsiString (1-Byte pro Zeichen) und WideString in neuen Versionen (2-Byte pro Zeichen).
  3. Delphi unterstützt Set von AnsiChar, unterstützt aber nicht Satz von WideChar.

Wenn wir also einen Code kompatibel mit allen Versionen von Delphi schreiben wollen, dann sollte es so etwas wie diese:

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

mit späterem Updates zu Delphi mobilem Code, der untere Stringindex geändert von 0 bis 1. Wenn Sie ältere Programme kompilieren, kompilieren und laufen sie korrekt mit 0 Startindex. Programme, die mit der späteren IDE erstellt wurden, erzeugen einen Fehler. Wenn Sie Mischungen haben, wird das Leben komplex!

Es wäre gut, in der Lage zu sein, ein älteres Programm zu nehmen und der IDE zu sagen, dass es auf den neuesten Stand gebracht werden soll (vielleicht würde das andere Dinge reparieren, wie Schriftarten, wenn Sie einen Anruf beantworten!) wäre gut, um die Dinge konsistent zu machen!

Verwandte Themen