Function to tell if a string contains a number
-
@pianofire This might be a stupid question, but what does this notation do:
variable[ 0:index - 1 ]
andvariable[ index + 1: ]
? I don't recall sing that before in the documentation. -
@PB____ Not a stupid question. Have a look at this: https://fuzearena.com/forum/topic/70/hints-and-tips/10
-
@pianofire nice & thanks! I wish I knew this earlier...
-
This post is deleted! -
Well, here I was trying to sound smart, only to realize my method has an issue. While you can use
float()
to help convert and check, it truncates whatever is invalid and onward. So if you had a string like "10x589.0", usingfloat()
would return 10. So I need to go back and see how to deal with that, without looping. -
@Discostew maybe convert it back to a string and compare the length with the original?
-
@pianofire Problem with doing that is with converting a float to a string, it may include extra 0s to the fraction portion that may not be in the original string, so the length may not be the same. But, I just made a revision to the function. No
floats
used.function isNumber( variable ) int result = false if( len( variable ) > 0 ) then if(( len( variable ) > 1 ) and (variable[ 0 ] == "-" )) then variable = "1" + variable[1:] else variable = "1" + variable endIf int cut = len( str( int( variable ))) variable = variable[ cut: ] if( len( variable ) > 0 ) then if(( len( variable ) > 1 ) and ( variable[ 0 ] == "." )) then cut = len( str( int( "1" + variable[1:] ))) variable = variable[ cut: ] result = len( variable ) == 0 endIf else result = 2 endIf endIf return result
You may be wondering why I tack on a "1" to the string. It's to make sure we have a correct number of characters to cull if a number starts with leading 0s. Converting a string like "1000" to an int then back to a string will still be "1000", but a string like "0010" converted to an int then back to a string will be "10", so the length doesn't match.
So now, you have a function to check if a string is a number, but what if you wanted to check if the number is specifically an integer? Or a float? Well, those are simple.
function isInteger( variable ) int result = false if( isNumber( variable )) then result = strFind( variable, "." ) == -1 endIf return result function isFloat( variable ) int result = false if( isNumber( variable )) then result = strFind( variable, "." ) != -1 endIf return result
You can technically exclude those specific functions as I made one slight alteration to the code. With true and false, a value of 0 means false and a non-0 is true. But, it's now set to where you can specifically check what type the number is, as a return value of 1 means it's a float, and a return value of 2 means it's an integer.
-
@Discostew I was thinking of starting a section for "Approved" user defined functions that people could download and use in their code (with attribution) and I was wondering if you would let me use this one as the first?
I have also added the unit test code from @PB____ (again if that is OK with them?)
// function: isNumber // description: find out if a string variable contains (only) a numeric value // author : @Discostew // arguments : // variable: string to be tested // returns : // 0 : not a numeric value // 1 : a float // 2 : an integer function isNumber( variable ) int result = false if ( len( variable ) > 0 ) then if ( ( len ( variable ) > 1 ) and ( variable[ 0 ] == "-" ) ) then variable = "1" + variable[ 1: ] else variable = "1" + variable endIf int cut = len( str( int( variable ) ) ) variable = variable[ cut: ] if ( len( variable ) > 0 ) then if ( ( len ( variable ) > 1 ) and ( variable[ 0 ] == "." ) ) then cut = len( str( int( "1" + variable[ 1: ] ) ) ) variable = variable[ cut: ] result = len (variable ) == 0 endIf else result = 2 endIf endIf return result // Unit test code by @PB____ // print with new line function printLn( value ) print( value, "\n" ) return void // join a series of values together in a string function join(values) string result = "" int i for i = 0 to len( values ) loop result += str( values[ i ] ) repeat return result // assert that value1 is equal to value2 function assertEqual( value1, value2 ) string str1 = str( value1 ) string str2 = str( value2 ) string outcome = "" if str1 == str2 then ink( lime ) outcome = "success" else ink( red ) outcome = "fail" endif println( join( [ "assert ", str1, " equals to ", str2, ": ", outcome ] ) ) return void // print test description function description( text ) ink( { 0.5, 0.5, 0.5, 1 } ) println(text) return void // run unit tests with the specified delay at the end function runUnitTests( duration ) description( "test integer" ) string stringVar = "12345" int output = isNumber( stringVar ) assertEqual( output, 2 ) description( "test float" ) string stringVar = "3.1415926" int output = isNumber( stringVar ) assertEqual( output, 1 ) description( "test negative" ) string stringVar = "-10" int output = isNumber(stringVar) assertEqual( output, 2 ) description( "test text" ) string stringVar = "the quick brown fox" int output = isNumber( stringVar ) assertEqual( output, 0 ) description( "test mixed" ) string stringVar = "10x589.0" int output = isNumber( stringVar ) assertEqual( output, 0 ) description( "test float with no integer part" ) string stringVar = ".5" int output = isNumber( stringVar ) assertEqual( output, 1 ) update() sleep( duration ) return void runUnitTests( 10 )
-
Of course, happy to be a part of it :)
Especially when sharing functions like this, I think including unit tests with them is a great idea :) -
@pianofire Go right ahead. This is for the benefit of the community.