How to test for a number
Lynch, Jonathan
BNZ2 at CDC.GOV
Wed Mar 16 11:50:47 EST 2005
Awesome stuff Rob!
Mine was not that advanced.
It just allowed the permitted characters upon being typed in, then
checked to see if it is a valid number with the isnumber function on
closefield. If it was not a number, it emptied the field and told you to
try again.
-----Original Message-----
From: use-revolution-bounces at lists.runrev.com
[mailto:use-revolution-bounces at lists.runrev.com] On Behalf Of Rob Cozens
Sent: Wednesday, March 16, 2005 11:35 AM
To: How to use Revolution
Subject: RE: How to test for a number
Hi Jonathan,
>I have a field where I restrict it to only enter numbers...
>
>But I had to include extra script to allow the character to be a "." or
a
>"-", in case the number included a decimal point or minus sign:
>
>On KeyDown theKey
> If (isNumber(theKey) = true) or theKey = "." or theKey = "-" then
> pass keyDown
>End KeyDown
And you do check to see there is only one "." and/or "-" in the
character
string, and that "-", if any, is char 1 or -1, right?
The following function is included in Serendipity Library
<http://wecode.org/serendipity/>.
It checks for your issues and Klaus'; based on the contents of the
stack's
numberEditMask custom property, which designates decimal & thousands
separator characters, currency symbol (to three characters}, and
currency
symbol placement (leading/trailing).
function validNumber theString,allowCurrency -- 08 Jan 04:RCC
put (allowCurrency is true) into allowCurrency--defaults to false
get the numberEditMask of this stack
if it is empty then
modal "Number Edit Mask"
get the numberEditMask of this stack
if it is empty then return sdbMessage(sdbNumberFormatError)
end if
put (char 1 of it is "<") into prefixCurrancy
put char 2 to -1 of line 1 of it into currencyString
put char 1 of line 2 of it into theDecimalSeparator
put char 2 of line 2 of it into theThousandsSeparator
put stripBlanks(theString,false) into strippedString
put the length of strippedString into stringLength
put 0 into periodPosition
put 0 into characterNumber
put empty into commaList
put false into foundMinus
repeat for each char theCharacter in theString
add 1 to characterNumber
if theCharacter is not in "0123456789-" and theCharacter is not
theDecimalSeparator and theCharacter is not theThousandsSeparator and
(theCharacter is not in currencyString or not allowCurrency) then return
false
if theCharacter is "-" then
if foundMinus or (characterNumber <> 1 and (characterNumber <>
(length(currencyString)+1) or not allowCurrency or not prefixCurrency))
then return false
put true into foundMinus
end if
if theCharacter is in currencyString then
if not allowCurrency then return false
if prefixCurrency then
if characterNumber > length(currencyString) or
offset(currencyString,theString) <> 1 then
return false
end if
else if offset(currencyString,theString) <>
(length(theString)-length(currencyString)+1) then return false
end if
if theCharacter is theThousandsSeparator then
if periodPosition is not 0 or characterNumber is 1 then return
false
else put characterNumbe&return after commaList
end if
if theCharacter is theDecimalSeparator then put characterNumber
into
periodPosition
end repeat
if commaList is empty then return true
if periodPosition is 0 then put stringLength+1 into periodPosition
repeat with x = number of lines of commaList down to 1
get (line x of commaList+0)
if periodPosition - it <> 4 then return false
subtract 4 from periodPosition
end repeat
return true
end validNumber
The Library includes other handlers to strip the thousand separators and
force the decimal separator to "." for numeric manipulation and convert
calculation results for localized display.
Rob Cozens, CCW
Serendipity Software Co.
"First they ignore you.
Then they laugh at you.
Then they fight you.
Then you win."
-- Gandhi
_______________________________________________
use-revolution mailing list
use-revolution at lists.runrev.com
http://lists.runrev.com/mailman/listinfo/use-revolution
More information about the use-livecode
mailing list