Check numeric characters
Dear All,
I have an amplifier which replies the same string sent to as well as the expected reply. For example:
Sending power on command:
'Z1POW1;'
the reply:
'Z1POW1;Z1POW1;' // the first one up to semicolon is the command as it has been sent while the second the reply
I need to know the power status so I'm using a data_event on "string" section.
But when I need to request the power status, I should send the 'Z1POW?;' command and the reply is:
'Z1POW?;Z1POW1;'
My question is how I can check that the character after the 'Z1POW' is a numeric or a character ? In my case, I don't care about the "?" but the "1".
data_event[dvAMP]
{
string:
{
local_var char cString[50]
local_var char oneline_grap[20]
cString = data.text
while (find_string(cString,';',1) )
{
oneline_grap= remove_string(cString,';',1)
if (find_string(oneline_grap,'Z1POW',1)) //Z1POW?;Z1POW1; { remove_string(oneline_grap,'POW',1) if ( atoi(oneline_grap) ) // is it a number ? { nPower = atoi(oneline_grap) send_string 0,"'Power = ', itoa(nPower)" } }
}
The above does not work reliable as the atoi(oneline_grap) is zero both for the number '0' as well as for any other non-numeric character.
I know that I can override this with some more piece of code but I also really like to know if there is a way to recognize between zero number and non- numeric character.
George
Comments
evaluate the penultimate character in the string
OR if you prefer hex values
As you noticed the ATOI function has the somewhat odd behaviour that both ASCII zero ( '0', $30) and any non-numeric character both give you the result 0. It would have been much easier if any non-numeric character would result in -1. So if zero (0) is a value you are interested in, be careful with ATOI. I usually do something like Ian described, just evaluate the ASCII itself.