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