Page 1 of 1
is a numeric value ECMA-404
Posted: Thu Mar 04, 2021 2:55 pm
by andresdt
Hello
I share with you this function that works perfectly for me. Determine if the value of a variable is a numerical value according to the ECMA-404 standard.
The function code:
Code: Select all
function isNumericValue pValue
local tFirstChar
put char 1 of pValue into tFirstChar
if tFirstChar is 0 and char 2 of pValue is not "." or tFirstChar is not in "-0123456789"
then return false
# Scientific notifications
if "e" is in pValue then
set the itemdel to "e"
if the number of items of pValue is 2 and char 1 of pValue is not in".e" and char -1 of pValue is not in".e" then
if char 1 of item 2 of pValue is in "+-" then
delete char 1 of item 2 of pValue
end if
put the item 1 of pValue & the item 2 of pValue into pValue
else
return false
end if
end if
split pValue by "."
if the number of elements of pValue > 2 then return false
if pValue[ 2 ] is empty then return pValue[ 1 ] is an integer
return pValue[ 1 ] is an integer and pValue[ 2 ] is an integer
end isNumericValue
Re: is a numeric value ECMA-404
Posted: Thu Mar 04, 2021 10:53 pm
by andresdt
I ran into a bug in the function code.
Well, since when evaluating the number 0 it returned false.
fixed
Code: Select all
function isNumericValue pValue
local tFirstChar
put char 1 of pValue into tFirstChar
if pValue is not an number then return false
put char 1 of pValue into tFirstChar
if tFirstChar is 0 and char 2 of pValue is not "." and the length of pValue is not 1 or tFirstChar is not in "-0123456789"
then return false
# Scientific notifications
if "e" is in pValue then
set the itemdel to "e"
if the number of items of pValue is 2 and char 1 of pValue is not in".e" and char -1 of pValue is not in".e" then
if char 1 of item 2 of pValue is in "+-" then
delete char 1 of item 2 of pValue
end if
put the item 1 of pValue & the item 2 of pValue into pValue
else
return false
end if
end if
split pValue by "."
if the number of elements of pValue > 2 then return false
if pValue[ 2 ] is empty then return pValue[ 1 ] is an integer
return pValue[ 1 ] is an integer and pValue[ 2 ] is an integer
end isNumericValue
Re: is a numeric value ECMA-404
Posted: Fri Mar 05, 2021 3:17 pm
by andresdt
I was reviewing the function and I noticed that it could be optimized a lot. Since if I use the LiveCode function (value is a number) I would only have to worry about the numbers that start with 0 and are not 0 or 0. # and the LiveCode constants that are numbers and other strange ones like infinity. So this is how the new version looks it is considerably smaller and faster.
Code: Select all
function _isNumericValue pValue
if pValue is not a number then return false
if char 1 of pValue is 0 and char 2 of pValue is not "." and the length of pValue is not 1 or char 1 of pValue is not in "-0123456789"
then return false
return true
end _isNumericValue
Re: is a numeric value ECMA-404
Posted: Fri Mar 05, 2021 3:38 pm
by Thierry
andresdt wrote: ↑Fri Mar 05, 2021 3:17 pm
....
So this is how the new version looks it is considerably smaller and faster.
Code: Select all
function _isNumericValue pValue
if pValue is not a number then return false
if char 1 of pValue is 0 and char 2 of pValue is not "." and the length of pValue is not 1 or char 1 of pValue is not in "-0123456789"
then return false
return true
end _isNumericValue
or a bit smaller and probably easier to read?
Code: Select all
function _isNumericValue pValue
if pValue is not a number then return false
return char 1 of pValue is 0 \
and char 2 of pValue is not "." \
and the length of pValue is not 1 \
or char 1 of pValue is not in "-0123456789"
end _isNumericValue
Kind regards,
Thierry
Re: is a numeric value ECMA-404
Posted: Fri Mar 05, 2021 4:38 pm
by andresdt
Thanks @Thierry.
In its version, for it to work correctly you must put everything that is returned in the second line between parentheses. Then evaluate whether everything in parentheses is false. Since like this , the opposite of what we want to obtain returns us. (For example for 2 it returns false and 002 returns true.)
In this way we can also put the first (if) on this line and it is even smaller. Also, it is a few milliseconds faster.
Thanks again. This is what it would look like:
Code: Select all
function _isNumericValue pValue
return pValue is a number and (char 1 of pValue is 0 \
and char 2 of pValue is not "." \
and the length of pValue is not 1 \
or char 1 of pValue is not in "-0123456789") is false
end _isNumericValue
Re: is a numeric value ECMA-404
Posted: Fri Mar 05, 2021 4:55 pm
by Thierry
Hi,
in fact, I didn't check the validity of your function; I did trust you
just rewriting your code a tiny bit....
this time, I drop the last part "is false" and add not before (
Code: Select all
function _isNumericValue pValue
return pValue is a number \
and not ( char 1 of pValue is 0 \
and char 2 of pValue is not "." \
and the length of pValue is not 1 \
or char 1 of pValue is not in "-0123456789")
end _isNumericValue
and I don't think you'll win few milliseconds,
but the code is certainly more beautiful.
So, what's next
Thierry