检查值是否为整数的最佳方法?Coldfusion 9

检查值是否为整数的最佳方法?Coldfusion 9,coldfusion,integer,coldfusion-9,isnumeric,Coldfusion,Integer,Coldfusion 9,Isnumeric,我有字段要测试,并确保它们只接受整数。功能很少,但我不确定哪一个是最好的。首先我尝试了isValid(“integer”,value),但我发现“1,5”将被接受为整数。因此,我尝试了isNumeric(value),但这将接受像1.5这样的值。我想知道检查整数最好的方法是什么?也许这两个功能结合在一起,比如: <cfif isValid("integer",value) AND isNumeric(value)> 或者有更好的方法吗?您可以尝试以下方法: value = re

我有字段要测试,并确保它们只接受
整数
。功能很少,但我不确定哪一个是最好的。首先我尝试了
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;
注意
人们通常在大量的数字中包括逗号,例如1000000
isNumeric
将为该字符串返回false,其他答案中的refind函数也将返回false。

以下是我更喜欢使用的isInteger UDF:

function isInteger(num){
    return YesNoFormat(refind("^-?\d+$", num) AND VAL(num) LTE 2147483647 AND VAL(num) GTE -2147483648);
}
下面是一些测试,用于确定它的功能,并与各种内置功能进行比较

使用TryCF.com查看结果

cfscript
//如果提供的值是高达32位的带符号整数,则返回。
函数isINT(任意值){
返回(
isSimpleValue(ARGUMENTS.value)&&
(reFind(“^\-?[0-9]{1,10}$”,ARGUMENTS.value)>0)&&
(ARGUMENTS.value=-2147483648)
);
}
cftag

  • isSimpleValue
    确保输入是基本类型(通过CF方式),因为所有数字在CF(字符串转换)中都被视为简单值
  • reFind
    正则表达式仅检查数字(带或不带符号),最少一位,最多十位(此处隐式调用
    toString
  • 检查范围,所有数字类型都适合4个字节,因此无需“升级”类型(正如您需要使用BigInteger、BigDecimal等)

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

我们使用round的方式?这比isValid()好吗?谢谢您的帮助。@espresso_coffee
isNumeric()
接受浮点数。他使用
round()
来切断精度,然后将该值与自身进行比较,以确保该数字是一个整数(整数)。附带说明:此函数不检查整数范围。如果您验证输入以将其放入数据库中的
int
字段,这可能会导致错误,该字段通常声明大小为4字节的
int
。我有一个检查每个值并检查范围的函数。在这种情况下,上述解决方案应该是最适合我的功能。谢谢大家!@意式浓缩咖啡根据我的测试脚本,此方法未通过以下值:1922921121212.1 2147483648“#CHR(28)#00501#CHR(28)#”“123”“123”“1234”和“07,201969”。内置的CFQueryParam&CFParam函数也不同意此答案,并将抛出CFErrors。另外,不要忘记VAL(“1234”)只返回“1”。为什么
ucase
YesNoFormat
?将
refind(“^-?\d+$”,num)
更改为
refind(^-?\d+$”,num)gt 0
并保持布尔值。
GTE-2147483647
似乎不正确<代码>-2147483648仍适用于32位的有符号整数范围。抱歉。我是从我使用的一个视觉输出测试中得到的。本机布尔值以大写形式转储,YesNoFormat值是混合大小写的文本字符串。我曾使用UCase强制执行相同的视觉样式。(我认为这是在使用CF9时出现的。)如果您在现实生活中使用此选项,请注意我的答案中有关逗号的更改。@DanBracuk此UDF评估值时没有任何修改或翻译尝试。根据CFParam或CFQueryParam,字符串“07,201969”和“1234”不是有效的整数。。。因此,测试修改后的值&然后使用原始值将导致错误。在我基于表单的输入中,我故意使用javascript来验证和限制最小/最大值(并防止在字段中键入或粘贴逗号)。如果您在现实生活中使用它,请注意我的答案中有关逗号的更改。测试isSimpleValue是一个很好的补充,可以防止数组/结构对象抛出错误。我不经常将这些类型的值传递给函数,但您永远不知道参数是否/何时会被覆盖并导致问题。(我正在更新我的个人自定义项以包含此内容。)谢谢。
// 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)
    );
}
<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>