Code: Alles auswählen
function IsNumber(s: string): boolean;
var
i, er: integer;
begin
Val(s, i, er);
Result := er = 0;
end;
Code: Alles auswählen
function IsNumber(s: string): boolean;
var
i, er: integer;
begin
Val(s, i, er);
Result := er = 0;
end;
Code: Alles auswählen
if TryStrToInt(StringGrid1.Cells[ACol, ARow], i0) and TryStrToInt(StringGrid1.Cells[BCol, BRow], i1) then begin
Result := i0 - i1;
end else begin
Result := CompareStr(StringGrid1.Cells[ACol, ARow], StringGrid1.Cells[BCol, BRow]);
end;
Code: Alles auswählen
function TryStrToInt(const s: string; out i : Longint) : boolean;
var Error : word;
begin
Val(s, i, Error);
TryStrToInt:=Error=0
end;
Code: Alles auswählen
function IsInteger(s: string) : boolean;
const digits = ['0'..'9'];
var i : integer = 1;
begin
result := true;
while result and (i<= length(s) ) do
begin
result := s[i] in digits;
if result then inc(i);
end; // while
end;
Warum am ende der branch? Der verhindert das genau einmal ein unnötiges INC ausgeführt wird, die schnellste instruction die eine CPU kann, um statdessen bei jedem anderen mal einen branch und eine instruction auszuführen. Also in jedem Fall in dem nicht direkt das erste zeichen keine Zahl ist, ist es strikt schlechter, (weil ungefähr mehr instructions ausgeführt werden) und in dem Fall ersetzt du einen INC aufruf durch einen branch, was auch nicht schneller ist (vielleicht sogar langsamer)Winni hat geschrieben:Hi!
Oder ganz einfach selbst machen:Grüße, WinniCode: Alles auswählen
function IsInteger(s: string) : boolean; const digits = ['0'..'9']; var i : integer = 1; begin result := true; while result and (i<= length(s) ) do begin result := s[i] in digits; if result then inc(i); end; // while end;
Code: Alles auswählen
function IsInteger(s: string): boolean; inline;
var
c: char;
begin
Result := s.length > 0;
for c in s do
if not (c in ['0'..'9']) then
exit(False); // oder Result := False; und break;
end;
Code: Alles auswählen
function IsInteger(s: string): boolean; inline;
var
c: char;
begin
Result := s.length > 0;
for c in s do
case c of
'0'..'9':
else:
exit(False); // oder Result := False; und break;
end;
end;
Code: Alles auswählen
function IsInteger(s: string): boolean; inline;
var
c: char;
begin
Result := s.length > 0;
for c in s do
if (c < '0') or (c > '9')
exit(False); // oder Result := False; und break;
end;
Code: Alles auswählen
var
str:string;
begin
str:='123A';
if strtointdef( str, -1) = -1 then
showmessage('Keine Zahl')
else
showmessage('Zahl: '+str);
end;
Was allerdings nicht korrekt ist. So ein Einsatz von magischen Konstanten wie deine -1 ist problematisch. Was machst du wenn wirklich jemand -1 eingibt?six1 hat geschrieben:Code: Alles auswählen
if strtointdef( str, -1) = -1 then showmessage('Keine Zahl') else showmessage('Zahl: '+str);
Dann enthält der Wert -1.m.fuchs hat geschrieben:Was allerdings nicht korrekt ist. So ein Einsatz von magischen Konstanten wie deine -1 ist problematisch. Was machst du wenn wirklich jemand -1 eingibt?
Nö, dann behauptet die Software "Keine Zahl". Eine Aussage die falsch ist. Und jeder Benutzer schaut auf den Bildschirm und weiß nicht mehr weiter.Timm Thaler hat geschrieben:Dann enthält der Wert -1.m.fuchs hat geschrieben:Was allerdings nicht korrekt ist. So ein Einsatz von magischen Konstanten wie deine -1 ist problematisch. Was machst du wenn wirklich jemand -1 eingibt?
Vollkommen richtig. Worauf ich hinaus will: die Prüfung muss auch ein korrektes Ergebnis zurückgeben. Wenn die oben genannte Routine sagen würde "Keine positive Zahl" oder "Eingabe außerhalb des gültigen Wertebereichs" wäre ja alles in Ordnung.Timm Thaler hat geschrieben:Normalerweise hat man ja einen gültigen Zahlenbereich, in dem der Wert liegen kann. Und gerade Eingaben sollte man auf diesen prüfen.
ja, superschlauer Einwandwp_xyz hat geschrieben:Na dann viel Spaß beim Fehlersuchen in einem Jahr, wenn du all das hier vergessen hast und dich plötzlich wunderst, warum deine User dir empört melden, dein Programm würde die Eingabe -1 als "keine Zahl" bemängeln.