Ken, et al:

BTW, Rob - just curious, but when would you see allowing multiple "-"s or
multiple currency symbols?

I wouldn't...which is why I fault keyDown "numeric input editor handlers" that allow the decimal separator, minus sign, or currency symbol regardless of their frequency (or, in the case of the latter two, position) in the input text.

FWIW, here's my handler from Serendipity Library. It validates input as compliant with the user's number formatting preferences, stored as a custom stack property, "numberEditMask":

function validNumber theString,allowCurrency -- 08 Jan 04:RCC
put (allowCurrency is true) into allowCurrency -- empty argument defaults to false
  get the numberEditMask of this stack
  if it is empty then
    modal "Number Edit Mask" -- sets the stack's numberEditMask
    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 --currency symbol may be multiple characters
  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 -- removes leading spaces, if any
  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


Rob Cozens CCW
Serendipity Software Company

"And I, which was two fooles, do so grow three;
 Who are a little wise, the best fooles bee."

from "The Triple Foole" by John Donne (1572-1631) _______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to