Merchants Posted March 28, 2010 Share Posted March 28, 2010 (edited) how to detected only number? <1234567890> Global $i = "89" HotKeySet("1", "Set_True_Number") HotKeySet("2", "Set_False_Number") HotKeySet("3", "Start") While 1 WEnd Func Set_True_Number() $i = "84" EndFunc Func Set_False_Number() $i = "e2" EndFunc Func Start() If $i = <Only Number> Then MsgBox(64, "Reading $i", "$i has only number") Else MsgBox(64, "Reading $i", "$i has number and words") EndIf EndFunc Edited March 28, 2010 by Merchants Link to comment Share on other sites More sharing options...
Andreik Posted March 28, 2010 Share Posted March 28, 2010 (edited) Function start should look like that.Func Start() If VarGetType($i) = "Int32" Then MsgBox(64, "Reading $i", "$i has only number") ElseIf VarGetType($i) = "String" Then MsgBox(64, "Reading $i", "$i has number and words") EndIf EndFuncPS: Make a main loop or your script will close fast. Edited March 28, 2010 by Andreik When the words fail... music speaks. Link to comment Share on other sites More sharing options...
water Posted March 28, 2010 Share Posted March 28, 2010 How about the AutoIt functions "IsInt" or "IsNumber"? My UDFs and Tutorials: Spoiler UDFs:Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - WikiExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example ScriptsOutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - WikiOutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - DownloadOutlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - WikiPowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - WikiTask Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs:Excel - Example Scripts - WikiWord - Wiki Tutorials:ADO - WikiWebDriver - Wiki Link to comment Share on other sites More sharing options...
Andreik Posted March 28, 2010 Share Posted March 28, 2010 How about the AutoIt functions "IsInt" or "IsNumber"?IsNumber will fail in this case because '-2' is number even if is stored as string. When the words fail... music speaks. Link to comment Share on other sites More sharing options...
GEOSoft Posted March 28, 2010 Share Posted March 28, 2010 IsNumber() could be used with some pre-processing $aRtn = StringRegExp("-1243abc", "-?(.+), 1) If NOT @Error Then MsgBox(0, "Result, IsNumber($aRtn[0])) EndIf George Question about decompiling code? Read the decompiling FAQ and don't bother posting the question in the forums.Be sure to read and follow the forum rules. -AKA the AutoIt Reading and Comprehension Skills test.*** The PCRE (Regular Expression) ToolKit for AutoIT - (Updated Oct 20, 2011 ver:3.0.1.13) - Please update your current version before filing any bug reports. The installer now includes both 32 and 64 bit versions. No change in version number. Visit my Blog .. currently not active but it will soon be resplendent with news and views. Also please remove any links you may have to my website. it is soon to be closed and replaced with something else. "Old age and treachery will always overcome youth and skill!" Link to comment Share on other sites More sharing options...
jchd Posted March 28, 2010 Share Posted March 28, 2010 (edited) IsNumber will happily return True for floatting point, so IsNumber(-12.3456e5) --> True. Hence it's not exactly what we want here (only 0..9 digits). OTOH, IsInt may give wrong results if we insist on a digits-only input: IsInt(-123) --> True. Imagine that for instance, the OP is looking for validating a part reference that needs to be only digits, but can be long, then things will fail as well: "1245887920309015374501650047186105301480980890408904168048048" @Merchants, will your input be a string representing a number or an AutoIt numeric type? If you need only 0..9 digits in your input, then try this: Local $input[5] = [ _ "+123.456E-5", _ -12345, _ +0.0002, _ "12345", _ "abcdef" _ ] For $inp In $input ConsoleWrite($inp & ' --> ' & StringRegExp(String($inp), "\A\d+\z", 0) & @LF) Next Time to answer the phone and others poster get faster to answer! Edited March 28, 2010 by jchd This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe hereRegExp tutorial: enough to get startedPCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta. SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt) Link to comment Share on other sites More sharing options...
Merchants Posted March 28, 2010 Author Share Posted March 28, 2010 @Merchants, will your input be a string representing a number or an AutoIt numeric type?a normal one: GuiCtrlCreateInput("", 75, 72, 150, 20) Link to comment Share on other sites More sharing options...
jchd Posted March 28, 2010 Share Posted March 28, 2010 I see, so that you really need filtering as it can contain about everything and in Unicode, that means a lot! My little example code should work for you (you asked for strictly 0..9, you got it) in all cases. You can drop forcing input to string as it will be a string anyway in your case. This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe hereRegExp tutorial: enough to get startedPCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta. SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt) Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted March 28, 2010 Moderators Share Posted March 28, 2010 (edited) Merchants,Here is an input that will only accept numbers. It will allow a leading "minus" and up to 2 decimal places:#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> GUICreate("Input Filter", 300, 30, -1, -1) Global $inTest = GUICtrlCreateInput("", 5, 5, 290) GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND") GUISetState(@SW_SHOW) While GUIGetMsg() <> $GUI_EVENT_CLOSE WEnd GUIRegisterMsg($WM_COMMAND, "") Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) Local $iIDFrom = BitAND($wParam, 0xFFFF);LoWord Local $iCode = BitShift($wParam, 16) ;HiWord If $iIDFrom = $inTest And $iCode = $EN_CHANGE Then $Read_Input = GUICtrlRead($inTest) If StringRegExp($Read_Input, '[^\d.-]|([{0-9,1}^\A-])[^\d.]') Then $Read_Input = StringRegExpReplace($Read_Input, '[^\d.-]|([{0-9,1}^\A-])[^\d.]', '\1') $Point1 = StringInStr($Read_Input, ".", 0) $Point2 = StringInStr($Read_Input, ".", 0, 2) If $Point2 <> 0 Then $Read_Input = StringLeft($Read_Input, $Point2 - 1) If $Point1 <> 0 Then $Read_Input = StringLeft($Read_Input, $Point1 + 2) GUICtrlSetData($inTest, $Read_Input) EndIf EndFunc;==>_WM_COMMANDYou might find it useful. M23Edit: Typnig! Edited March 28, 2010 by Melba23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Merchants Posted March 28, 2010 Author Share Posted March 28, 2010 Merchants, Here is an input that will only accept numbers. It will allow a leading "minus" and up to 2 decimal places: #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> GUICreate("Input Filter", 300, 30, -1, -1) Global $inTest = GUICtrlCreateInput("", 5, 5, 290) GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND") GUISetState(@SW_SHOW) While GUIGetMsg() <> $GUI_EVENT_CLOSE WEnd GUIRegisterMsg($WM_COMMAND, "") Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) Local $iIDFrom = BitAND($wParam, 0xFFFF);LoWord Local $iCode = BitShift($wParam, 16) ;HiWord If $iIDFrom = $inTest And $iCode = $EN_CHANGE Then $Read_Input = GUICtrlRead($inTest) If StringRegExp($Read_Input, '[^\d.-]|([{0-9,1}^\A-])[^\d.]') Then $Read_Input = StringRegExpReplace($Read_Input, '[^\d.-]|([{0-9,1}^\A-])[^\d.]', '\1') $Point1 = StringInStr($Read_Input, ".", 0) $Point2 = StringInStr($Read_Input, ".", 0, 2) If $Point2 <> 0 Then $Read_Input = StringLeft($Read_Input, $Point2 - 1) If $Point1 <> 0 Then $Read_Input = StringLeft($Read_Input, $Point1 + 2) GUICtrlSetData($inTest, $Read_Input) EndIf EndFunc;==>_WM_COMMAND You might find it useful. M23 Edit: Typnig! uhm it is maby a script but this was not wat i was looking for here by you can use the GUI Control Styles: GuiCtrlCreateInput("", 75, 72, 150, 20, 0x2000) Link to comment Share on other sites More sharing options...
Merchants Posted March 28, 2010 Author Share Posted March 28, 2010 try to look back in post 1 Link to comment Share on other sites More sharing options...
GEOSoft Posted March 28, 2010 Share Posted March 28, 2010 Possibility #4069 In The MsgLoop for the GUI While 1 If NOT StringRegExp(StringRight(GUICtrlRead($hInput), 1),"[\d.\-]") Then GUICtrlSetData($hInput, StringTrimRight(GUICtrlRead($hInput), 1)) $hMsg = GUIGetMsg() Switch $hMsg ;;;; Blah, blah, blah WEnd George Question about decompiling code? Read the decompiling FAQ and don't bother posting the question in the forums.Be sure to read and follow the forum rules. -AKA the AutoIt Reading and Comprehension Skills test.*** The PCRE (Regular Expression) ToolKit for AutoIT - (Updated Oct 20, 2011 ver:3.0.1.13) - Please update your current version before filing any bug reports. The installer now includes both 32 and 64 bit versions. No change in version number. Visit my Blog .. currently not active but it will soon be resplendent with news and views. Also please remove any links you may have to my website. it is soon to be closed and replaced with something else. "Old age and treachery will always overcome youth and skill!" Link to comment Share on other sites More sharing options...
Merchants Posted March 28, 2010 Author Share Posted March 28, 2010 (edited) Possibility #4069 In The MsgLoop for the GUI While 1 If NOT StringRegExp(StringRight(GUICtrlRead($hInput), 1),"[\d.\-]") Then GUICtrlSetData($hInput, StringTrimRight(GUICtrlRead($hInput), 1)) $hMsg = GUIGetMsg() Switch $hMsg ;;;; Blah, blah, blah WEnd Make a example because i don't not realy get it #include <GUIConstantsEx.au3> Global $GUI[4] Start() Func Start() $GUI[0]= GUICreate("test", 300, 70) $GUI[1] = GuiCtrlCreateInput("", 75, 22, 150, 20) $GUI[2] = GUICtrlCreateButton("Set", 230, 21, 50, 22) GUICtrlCreateLabel("Index 1:", 20, 25) GUISetState() While 1 $GUI[3] = GUIGetMsg($GUI[0]) Select Case $GUI[3] = $GUI_EVENT_CLOSE Exit Case $GUI[3] = $GUI[1] Start1() EndSelect WEnd EndFunc Func Start1() If StringRight(GUICtrlRead($GUI[2]), 2) = <Only Number> Then MsgBox(64, "Reading $i", "$i has only number") Else MsgBox(64, "Reading $i", "$i has number and words") EndIf EndFunc Edited March 28, 2010 by Merchants Link to comment Share on other sites More sharing options...
jchd Posted March 28, 2010 Share Posted March 28, 2010 Are you home with that:#include <GUIConstantsEx.au3> Global $GUI[4] Start() Func Start() $GUI[0]= GUICreate("test", 300, 70) $GUI[1] = GuiCtrlCreateInput("", 75, 22, 150, 20) $GUI[2] = GUICtrlCreateButton("Set", 230, 21, 50, 22) GUICtrlCreateLabel("Index 1:", 20, 25) GUISetState() While 1 $GUI[3] = GUIGetMsg($GUI[0]) Select Case $GUI[3] = $GUI_EVENT_CLOSE Exit Case $GUI[3] = $GUI[1] Start1() EndSelect WEnd EndFunc Func Start1() If StringRegExp(StringRight(GUICtrlRead($GUI[1]), 2), "\A\d+\z", 0) Then MsgBox(64, "Reading $i", "The two rightmost characters of input = " & StringRight(GUICtrlRead($GUI[1]), 2) & " are only 0..9") Else MsgBox(64, "Reading $i", "The two rightmost characters of input = " & StringRight(GUICtrlRead($GUI[1]), 2) & " are 0..9 and/or anything else") EndIf EndFunc(Beware the indexing, GUICtrlRead($GUI[1]) This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe hereRegExp tutorial: enough to get startedPCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta. SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt) Link to comment Share on other sites More sharing options...
Malkey Posted March 28, 2010 Share Posted March 28, 2010 Another example.Global $i = 89 HotKeySet("1", "Set_True_Number") HotKeySet("2", "Set_False_Number") HotKeySet("3", "Start") HotKeySet("{ESC}", "Terminate") While 1 Sleep(10) ; Reduces CPU usage. WEnd Func Set_True_Number() $i = "84" Start() EndFunc ;==>Set_True_Number Func Set_False_Number() $i = "e2" Start() EndFunc ;==>Set_False_Number Func Terminate() Exit 0 EndFunc ;==>Terminate Func Start() If StringRegExp($i, "[0-9]{" & StringLen($i) & "}") Then ; True only when all characters are digits (0 to 9). MsgBox(64, "Reading $i", $i & " is only number", 2) Else MsgBox(64, "Reading $i", $i & " is number and words", 2) EndIf EndFunc ;==>Start Link to comment Share on other sites More sharing options...
Merchants Posted March 31, 2010 Author Share Posted March 31, 2010 (edited) Another example. Global $i = 89 HotKeySet("1", "Set_True_Number") HotKeySet("2", "Set_False_Number") HotKeySet("3", "Start") HotKeySet("{ESC}", "Terminate") While 1 Sleep(10) ; Reduces CPU usage. WEnd Func Set_True_Number() $i = "84" Start() EndFunc ;==>Set_True_Number Func Set_False_Number() $i = "e2" Start() EndFunc ;==>Set_False_Number Func Terminate() Exit 0 EndFunc ;==>Terminate Func Start() If StringRegExp($i, "[0-9]{" & StringLen($i) & "}") Then ; True only when all characters are digits (0 to 9). MsgBox(64, "Reading $i", $i & " is only number", 2) Else MsgBox(64, "Reading $i", $i & " is number and words", 2) EndIf EndFunc ;==>Start got my self in a lite problem... if the string = 11 Then run test good ElseIf string = 01 Then test not good #include <GUIConstantsEx.au3> Global $GUI[4] $GUI[0]= GUICreate("test", 300, 70) $GUI[1] = GuiCtrlCreateInput("01", 75, 22, 150, 20) $GUI[2] = GUICtrlCreateButton("Set", 230, 21, 50, 22) GUICtrlCreateLabel("Index 1:", 20, 25) GUISetState() While 1 $GUI[3] = GUIGetMsg($GUI[0]) Select Case $GUI[3] = $GUI_EVENT_CLOSE Exit Case $GUI[3] = $GUI[2] If StringRegExp(StringLeft(GUICtrlRead($GUI[1]), 2), "[1-9]") Then MsgBox(64, "test", "test good " & StringLeft(GUICtrlRead($GUI[1]), 2)) Else MsgBox(64, "test", "test not good " & StringLeft(GUICtrlRead($GUI[1]), 2)) EndIf EndSelect WEnd Edited March 31, 2010 by Merchants Link to comment Share on other sites More sharing options...
jchd Posted March 31, 2010 Share Posted March 31, 2010 Did you run your own example? It works as is, but probably not the way you intend.The regexp you use now will match if it finds one digit between 1 and 9 anywhere in the string or rather within the leftmost 2 characters of the string, due to the StringLeft() call.So it matches '01', '11', '*3whatever you want', '5', ...It barks on '00', 'v0', ... This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe hereRegExp tutorial: enough to get startedPCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta. SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt) Link to comment Share on other sites More sharing options...
Merchants Posted March 31, 2010 Author Share Posted March 31, 2010 (edited) Did you run your own example? It works as is, but probably not the way you intend. The regexp you use now will match if it finds one digit between 1 and 9 anywhere in the string or rather within the leftmost 2 characters of the string, due to the StringLeft() call. So it matches '01', '11', '*3whatever you want', '5', ... It barks on '00', 'v0', ... uhm ok wel i found a way to get that good If StringRegExp(StringLeft(StringRight(GUICtrlRead($GUI[1]), 2), 1), "[1-9]") Then MsgBox(64, "test", "test good") Else MsgBox(64, "test", "test not good") EndIf Edited March 31, 2010 by Merchants Link to comment Share on other sites More sharing options...
jchd Posted March 31, 2010 Share Posted March 31, 2010 Sound overcomplex to me. What, precisely are your requirement? Your first post said that the string had to be only digis 0..9, then it was the first 2 chars in 1..9, now only the second last in 1..9. I'm still unsure that what you've come up with will work in all cases: "My memory size is 8G" matches fine your last version. Is that what you want? This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe hereRegExp tutorial: enough to get startedPCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta. SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt) Link to comment Share on other sites More sharing options...
GEOSoft Posted March 31, 2010 Share Posted March 31, 2010 I think the OP better start all over again with what he wants here. Comments like "read my first post again" just don't cut it because that code was a total mess and it will hurt to read it again. Next issue, although it will work, why are you creating the GUI as an array? Third, if you are using 0x2000 as the style then all of this bit of making sure that it will accept negative numbers or decimal places is for naught. 0x2000 says to accept ONLY digits so that style is useless unless he wants a positive whole number in which case he needs nothing other than the style. Fourth, if he wants to use negative numbers or numbers with decimal places then he already has SRE examples given that will do that. Since it's an input box and assumably he is typing data into the input box then the only characters he has to check are the first (for a minus sign) and the last to make sure it's either a decimal point OR a digit. The one thing I forgot to allow for was some idiot typing in more than one decimal point or the situation where it starts with a decimal (-? should have been [-.]?) Don't understand this, read my first sentence again. George Question about decompiling code? Read the decompiling FAQ and don't bother posting the question in the forums.Be sure to read and follow the forum rules. -AKA the AutoIt Reading and Comprehension Skills test.*** The PCRE (Regular Expression) ToolKit for AutoIT - (Updated Oct 20, 2011 ver:3.0.1.13) - Please update your current version before filing any bug reports. The installer now includes both 32 and 64 bit versions. No change in version number. Visit my Blog .. currently not active but it will soon be resplendent with news and views. Also please remove any links you may have to my website. it is soon to be closed and replaced with something else. "Old age and treachery will always overcome youth and skill!" Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now