I have fields to test and make sure they only accept integers
. There is few functions but I wasn't sure which one is the best. First I tried isValid("integer",value)
but I have discovered that "1,5" will be accepted as an integer. So then I tried isNumeric(value)
but this will accept values like 1.5
. I'm wondering what should be the best way to check for integers? Maybe two combine these two functions like:
<cfif isValid("integer",value) AND isNumeric(value)>
Or there is better way to do this?
You could try this:
value = replace(value, ',', '', 'all');
numberIsInteger = isNumeric(value) && round(value) == value ? true : false;
Note
People often include commas in large numbers such as 1,000,000. isNumeric
will return false for that string, as will the refind function in the other answers.
cfscript
// Returns if the provided value is a signed integer up to 32 Bit.
function isINT(any value) {
return (
isSimpleValue(ARGUMENTS.value) &&
(reFind("^\-?[0-9]{1,10}$", ARGUMENTS.value) > 0) &&
(ARGUMENTS.value <= 2147483647) &&
(ARGUMENTS.value >= -2147483648)
);
}
cftag
<cffunction name="isINT" access="public" output="false" returnType="boolean"
hint="Returns if the provided value is a signed integer up to 32 Bit.">
<cfargument name="value" type="any" required="true">
<cfreturn (
isSimpleValue(ARGUMENTS.value) and
(reFind("^\-?[0-9]{1,10}$", ARGUMENTS.value) gt 0) and
(ARGUMENTS.value lte 2147483647) and
(ARGUMENTS.value gte -2147483648)
)>
</cffunction>
isSimpleValue
making sure the input is a primitive type (by CF means), because all numbers are considered simple values in CF (string conversion)
reFind
regular expression checking digits-only (with or without sign), minimum of one digit, maximum of ten digits (implicit call of toString
here)
- check the range, all numeric types fit into 4 Bytes, thus no need to "upgrade" the type (as you would need to with BigInteger, BigDecimal etc.)
If you don't need the range check for 4 Byte integers, @DanBracuk posted an answer with a function that performs around 5-6 times faster than this one.
Here's the isInteger UDF that I prefer using:
function isInteger(num){
return YesNoFormat(refind("^-?\d+$", num) AND VAL(num) LTE 2147483647 AND VAL(num) GTE -2147483648);
}
Here are some tests to determine how it functions and compares against the various built-in functions.
https://gist.github.com/JamoCA/fab1104a3a9074434ff336630dd5ffd1
View the results using TryCF.com
https://trycf.com/gist/fab1104a3a9074434ff336630dd5ffd1