Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
Solved

# check string for numbers

Posted on 2004-09-28
Medium Priority
307 Views
I have a written a DLL which returns strings and integers from string. I am having a problem whereby if the string does not contain a valid number the real type conversion fails. What I need is a if else statement that checks there is a valid number.

Function lenofcall(S1,S2 : String) :Real;

Begin
Result := (StrToFloat(copy(S1,1,2))*60)+(StrToFloat(copy(S1,4,2)));
end

for instance the following text would give a result of 129
S1 := '01:59'

but if
S1 := '----' or any other non number text,
then I want the result to give a result of '0'

any Ideas

0
Question by:lloydie-t
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 4
• 3
• 2
• +1

LVL 23

Expert Comment

ID: 12169284
just put it in a try except...

Function lenofcall(S1,S2 : String) :Real;
Begin
try
Result := (StrToFloat(copy(S1,1,2))*60)+(StrToFloat(copy(S1,4,2)));
except
Result := 0;
end;
end;
0

LVL 1

Expert Comment

ID: 12170263
HI
Try this

Function String_TO_REAL(STR:STRING):Real;
Const Number_Str='0123456789.';
Var
Alpha:String;
i:Integer;
Begin
for i :=0 to length(Str) do
Begin
if pos(str[i],Number_Str)>0 then
Alpha:=Alpha+str[i];
end;
Result:=StrToFloat(Alpha);
end;
0

LVL 1

Expert Comment

ID: 12170285

Function String_TO_REAL(STR:STRING):Real;
Const Number_Str='0123456789.';
Var
Alpha:String;
i:Integer;
Begin
for i :=1 to length(Str) do               // start from 1 not from 0
Begin
if pos(str[i],Number_Str)>0 then
Alpha:=Alpha+str[i];
end;
Result:=StrToFloat(Alpha);
end;
0

LVL 17

Expert Comment

ID: 12170844
For those who haven't noticed this: lloydie-t wants to convert a string containing a time to a number of minutes. So:

var
Hour, Min, Sec, MSec: Word;
begin
DecodeTime( StrToTime( '01:59' ), Hour, Min, Sec, MSec );
Result := Hour * 60 + Min;
end;

And the result is 119, not 129... ;-)
0

LVL 17

Accepted Solution

Wim ten Brink earned 500 total points
ID: 12170858
Oh, and since we want to result 0 if we don't have a valid time:

var
Hour, Min, Sec, MSec: Word;
begin
try
DecodeTime( StrToTime( '01:59' ), Hour, Min, Sec, MSec );
Result := Hour * 60 + Min;
except Result := 0;
end;
end;

Life isn't difficult if you think logical.
0

Author Comment

ID: 12173933
Nearly there Alex, I have tried your code, but it does raise an excption when the string is not in a time format
FI: |SBNode is not a valid time.

this is the code I'm using

Function LenOfCall (S1,S2: String): Real; stdcall;
var
Hour, Min, Sec, Msec:Word;
Begin
try
DecodeTime(strToTime(copy(S1,50,8)),Hour,Min,Sec,Msec);
Result := Hour*60+Min+Sec/60;
except
Result := 0;
end;
end;

but it is much neater. Any other ideas

0

Author Comment

ID: 12174382
Seems as though the debugger is working overtime. The exception is raised only when running the app in delphi, running it stand alone does'nt seem to cause a problem.
0

LVL 17

Expert Comment

ID: 12175014
That might be related to the locale settings, the date-time separator. :-) But you could just use: S1[3] := ':';
And then use my solution to convert it.

Oh, and why: strToTime(copy(S1,50,8)) ???
You're copying 8 characters but the time would just be 5 characters. Maybe use: strToTime(copy(S1,50,5))
0

Author Comment

ID: 12175148
The exception only happens when I receive a string such as '----------' or '|SBNode'. I read somewhere that the debugger can sometimes pick these up even when using 'try except'. Otherwise It seems to work OK and as expected, when not running in delphi using the same data.

0

LVL 17

Expert Comment

ID: 12177759
Ehm, yes. The debugger picks up exceptions if you've set it up like that in de debug options under the Tools menu. Then the debugger stops at the exception, but if you press F9 it will just let the application handle it further. You'd have to turn that "Break on exception" option off if you don't want that.
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the inâ€¦
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGridâ€¦
Have you created a query with information for a calendar? ... and then, abra-cadabra, the calendar is done?! I am going to show you how to make that happen. Visualize your data!  ... really see it To use the code to create a calendar from a qâ€¦
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infrasâ€¦
###### Suggested Courses
Course of the Month11 days, 19 hours left to enroll