【问题标题】:Best way to check if value is integer ? Coldfusion 9检查值是否为整数的最佳方法?冷融合 9
【发布时间】:2026-02-05 08:15:02
【问题描述】:

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

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

或者有更好的方法吗?

【问题讨论】:

    标签: coldfusion integer coldfusion-9 isnumeric


    【解决方案1】:

    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 字节,因此无需“升级”类型(您需要使用 BigInteger、BigDecimal 等)

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

    【讨论】:

    • 如果您在现实生活中使用它,请注意我对逗号的回答所做的更改。
    • 测试 isSimpleValue 是一个很好的补充,可以防止数组/结构对象抛出错误。我不经常将这些类型的值传递给函数,但你永远不知道参数是否/何时可能被覆盖并导致问题。 (我正在更新我的个人 UDF 以包含此内容。)谢谢。
    【解决方案2】:

    这是我更喜欢使用的 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

    【讨论】:

    • 为什么是ucaseYesNoFormat?将 refind("^-?\d+$", num) 更改为 refind("^-?\d+$", num) gt 0 并保持布尔值。
    • GTE -2147483647 似乎不正确。 -2147483648 仍然适合 32 位的有符号整数范围。
    • 对不起。我是从我使用的视觉输出测试中得到的。本机布尔值以大写形式转储,而 YesNoFormat 值是混合大小写的文本字符串。我曾使用 UCase 来强制执行相同的视觉风格。 (我认为这是在使用 CF9 时。)
    • 如果您在现实生活中使用它,请注意我对逗号的回答所做的更改。
    • @DanBracuk 此 UDF 评估值而不进行任何修改或翻译尝试。根据 CFParam 或 CFQueryParam,字符串 "07,20,1969" 和 "1,234" 不是有效整数......因此测试修改后的值然后使用原始值将导致错误。在基于表单的输入中,我有意使用 javascript 来验证和限制最小/最大值(并防止在字段中键入或粘贴逗号。)
    【解决方案3】:

    你可以试试这个:

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

    注意 人们经常包含大量逗号,例如 1,000,000。 isNumeric 将为该字符串返回 false,其他答案中的 refind 函数也是如此。

    【讨论】:

    • 我们如何使用圆形?这比 isValid() 好吗?感谢您的帮助。
    • @espresso_coffee isNumeric() 接受浮点数。他使用round() 截断精度,然后将值与自身进行比较以确保数字是整数(整数)。
    • 附带说明:此函数不检查整数范围。如果您验证输入以将它们放入数据库中的 int 字段中,这可能会导致错误,该字段通常声明大小为 4 字节的 int
    • 我有检查每个值并检查范围的功能。在这种情况下,上面的解决方案应该最适合我的功能。谢谢!
    • @espresso_coffee 根据我的测试脚本trycf.com/gist/fab1104a3a9074434ff336630dd5ffd1,此方法无法满足以下值:192292121121121212.1 2147483648 "#CHR(28)#00501#CHR(28)#" " 123 " " 123" " 123 " "1,234" 和 "07,20,1969"。内置的 CFQueryParam 和 CFParam 函数也不同意这个答案,并且会抛出 CFErrors。另外,不要忘记 VAL("1,234") 只会返回 "1"。