检查值是否为整数的最佳方法?冷聚变 9

Best way to check if value is integer ? Coldfusion 9

我有一些字段要测试并确保它们只接受 integers。功能很少,但我不确定哪个是最好的。首先我尝试了 isValid("integer",value) 但我发现“1,5”将被接受为一个整数。所以我尝试了 isNumeric(value) 但这将接受像 1.5 这样的值。我想知道检查整数的最佳方法应该是什么?也许两个结合这两个功能,如:

<cfif isValid("integer",value) AND isNumeric(value)>

或者有更好的方法吗?

你可以试试这个:

value = replace(value, ',', '', 'all');
numberIsInteger = isNumeric(value) && round(value) == value ? true : false;

备注 人们通常在大数字中包含逗号,例如 1,000,000。 isNumeric 将为该字符串 return false,其他答案中的 refind 函数也是如此。

这是我更喜欢使用的 isInteger UDF:

function isInteger(num){
    return YesNoFormat(refind("^-?\d+$", num) AND VAL(num) LTE 2147483647 AND VAL(num) GTE -2147483648);
}

这里有一些测试来确定它如何运行并与各种内置函数进行比较。

https://gist.github.com/JamoCA/fab1104a3a9074434ff336630dd5ffd1

使用TryCF.com查看结果

https://trycf.com/gist/fab1104a3a9074434ff336630dd5ffd1

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 确保输入是原始类型(通过 CF 表示),因为所有数字在 CF 中都被视为简单值(字符串转换)
  • reFind正则表达式只检查数字(带或不带符号),最少一位,最多十位(此处隐式调用toString
  • 检查范围,所有数字类型都适合 4 个字节,因此不需要 "upgrade" 类型(因为您需要使用 BigInteger、BigDecimal 等)

如果您不需要 4 字节整数的范围检查,@DanBracuk 发布了一个答案,其中的函数执行速度比这个函数快 5-6 倍。