keyInField

Jan Schenkel janschenkel at yahoo.com
Thu Sep 26 17:28:00 EDT 2002


Hi Yves et al,

It took me a bit to construct, and it's a combination
of bits and pieces from earlier posts, but here's the
"definitive" solution for numeric fields *chuckle*

--- Field script for a numeric field

local sBeforePaste

on keyDown pWhichKey
  put the selectedChunk into tChunk
  put word 2 of tChunk into tStart
  put word 4 of tChunk into tStop
  if tStart > tStop -- no actual selection 
    put (char 1 to tStop of me) & pWhichKey \
      into tCheck
    if length(me) > theStart then
      put (char tStart to -1 of me) after tCheck
    end if
  else -- typing would replace the selected text
    put (char 1 to tStart - 1 of me) & pWhichKey \
      into tCheck
    if length(me) > theStop then
      put (char tStop + 1 to -1 of me) after tCheck
    end if
  end if
  if Conv4Calc(tCheck) is a number then pass keyDown
  else beep
end keyDown

-- Reformat upon leaving the field

on closeField
  if "formatField" is not in the pendingMessages \
  then send "formatField" to me in 5 milliseconds
end closeField

on formatField
  put the text of me into tNumber
  put Conv4Disp(tNumber) into me
end formatField

-- Handle pasting of text in this field
-- NOTE : doesn't work when Rev UI is ON

on pasteKey
  put the text of me into sBeforePaste
  if "checkAfterPaste" is not in the pendingMessages \
  then send "checkAfterPaste" to me in 5 milliseconds
  pass pasteKey
end pasteKey

on checkAfterPaste
  put the text of me into tAfterPaste
  if Conv4Calc(tAfterPaste) is not a number then
    beep
    put sBeforePaste into me
  end if
end checkAfterPaste

-- Conversion between calculation and display formats

function Conv4Calc pNumber
  -- strip out the thousand separator (if any)
  put the uThousandSeparator of me into t1000Sep
  if t1000Sep is not empty then
    replace t1000Sep with "" in pNumber
  end if
  -- fix the decimal point for MetaCard/RunRev
  put the uDecimalPoint of me into tDecPoint
  if tDecPoint is not empty and tDecPoint <> "." \
    then replace tDecPoint with "." in pNumber
  -- should now be a regular number
  return pNumber
end Conv4Calc

function Conv4Disp pNumber
  -- convert to the chosen floating point format
  put the uFormat of me into tFormat
  if tFormat is empty then put "%16.2f" into tFormat
  put format(tFormat, pNumber) into tNumber
  -- remove leading spaces
  put 1 into tStart
  repeat while char tStart of tNumber = " "
    add 1 to tStart
  end repeat
  put char tStart to -1 of pNumber into tNumber
  -- prepare the display format
  -- thanks to Ken Ray for this RegExp :-)
  local tMinusHold,tMainNumber,tDecimalHold
  get matchText(tNumber, \
    "([-]?)([0-9]*)[\.]?([0-9*)", \
    tMinusHold, tMainNumber, tDecimalHold)
  -- tweak tDecimalHold
  put the uDecimalPoint of me into tDecPoint
  if tDecPoint is empty then put "." into tDecPoint
  if tDecimalHold is not empty then put tDecPoint \
    before tDecimalHold
  -- now determine how many separators to place
  put the uThousandSeparator of me into t1000Sep
  if t1000Sep is not empty then
    put length(tMainNumber) into tLength
    put (tLength DIV 3) into tSeps
    if (tLength MOD 3) = 0 then subtract 1 from tSeps
    -- insert the commas into the integer part
    repeat with i = tSeps down to 1
      put t1000Sep after char - (i * 3 + 1) of \
        tMainNumber
    end repeat
  end if
  -- put everything back together
  return tMinusHold & tMainNumber & tDecimalHold
end Conv4Calc

--- End of script

Hope this suits everyone's needs ; all you need to do
is fill in the following custom properties
- uDecimalPoint (defaults to ".")
- uThousandSeparator (defaults to empty)
- uFormat (defaults to "%16.2f")

Of course you can always adapt the scripts so that
these custom properties are in the card, stack,...

BeHave fun,

Jan Schenkel.

"As we grow older, we grow both wiser and more foolish
at the same time."  (De Rochefoucald)

--- yves COPPE <yvescoppe at skynet.be> wrote:
> Hi Jan
> 
> 
> in your script for numeric fld, I've understood that
> you can change 
> the numbers after the decimal with
> 
> 
>    put format("%16.3f", tNumber) into tFormatted
> 
> if we change .3f with .2f, it gives 2 numbers after
> decimal.
> 
> Now : 2 problems :
> 
> 1) I'd like the separator of decimal is a comma and
> not a point.
> is it possible ?
> 
> 2) I' d like a separator for the thousands (a space
> for example)
> 
> 
> so : 123456789 ->  1 234 567,89
> 
> can you insert that in your script ?
> 
> thanks.
> 
> -- 
> Greetings.
> 
> Yves COPPE
> 
> Email : yvescoppe at skynet.be

__________________________________________________
Do you Yahoo!?
New DSL Internet Access from SBC & Yahoo!
http://sbc.yahoo.com



More information about the Use-livecode mailing list