keyInField
yves COPPE
yvescoppe at skynet.be
Fri Sep 27 01:49:00 EDT 2002
Hi Jan
that's the final good code : BUT
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 then-- 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
-- and the next line was wrong of course
-- put char tStart to -1 of pNumber into tNumber
put char tStart to -1 of tNumber 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 Conv4Disp
--- 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")
BUT
I do so :
uDecimalPoint : ","
uThousandSeparator : " "
uFormat : "%16.2f"
Now if I type :
1234567 -> 1 234 567,00
OK
BUT
1234567,2
I hope : 1 234 567,20
but I get an error !
can you develop your script a little further ?
--
Greetings.
Yves COPPE
Email : yvescoppe at skynet.be
More information about the use-livecode
mailing list