Why does #isValid("integer","1,5")#
output YES? I expected it to output NO like #isValid("integer","1.5")#
does.
I'm going to validate with <CFIF isvalid("integer","1,5") AND isnumeric("1,5")>
...
Why does #isValid("integer","1,5")#
output YES? I expected it to output NO like #isValid("integer","1.5")#
does.
I'm going to validate with <CFIF isvalid("integer","1,5") AND isnumeric("1,5")>
...
Adobe is aware of this, but...
State: Closed
Status: Withdrawn
Reason: AsDesigned
https://bugbase.adobe.com/index.cfm?event=bug&id=3169196
TBH I'm a little embarrassed to be using a language that can't even validate integer correctly.
UPDATE:
Guess what, it'll be addressed in CF12!
There is no doubt that this behavior is incorrect. It is obviously wrong and it should be corrected. However, it has been like this forever and making such a fundamental change has a great potential to break a lot of applications. We dont want to do that in this release. As Rakshith has already communicated, we plan to take up such changes in 'Dazzle' where we will correct the behavior without worrying about backward compatibility.
http://blog.adamcameron.me/2014/02/can-we-please-agree-that-adobe-is-not.html
Just to expand on the answer here and explain what's actually going on.
See this related bug, a summary of the detail of which is that CF will interpret "m
,n
" (where m
and n
are digits) as a DATE if it possibly can. This is ludicrous: "m
,n
" is not a format that represents a date to anyone on the planet, so there is no reason for CF to ever interpret it this way.
Adobe copped-out of fixing this issue to, citing the same excuse that it would break backwards compat. Nonsense it would.
Anyway... because a date can be cast to an integer in CF, CF thinks "1,5" is a legit integer, because it's actually a date. How embrrassing it is - as a dedicated CF developer - to have to offer you than explanation. Sorry.
'0,6' == '6,0'
TRUE... '12,31' == '31,12'
TRUE... '12,6' == '6,12'
FALSE... '1,6' == '6,1'
FALSE... Oh god, why? –
Plantagenet '12a' + 0
== 0. '12b' + 0
== throw "The value 12b cannot be converted to a number". isNumeric( '12a' )
== false. What gives? –
Plantagenet If you want to make absolutely sure you have an Integer, you could use Java Integer methods.
<cfscript>
createObject("java","java.lang.Integer").parseInt("1,5");
</cfscript>
The parseInt() method throws when it is given anything that cannot be interpreted as an Integer. This includes "1,5"
.
isvalid("integer","1,5") AND isnumeric("1,5")
miss some cases which I did not consider where the input is not an integer. –
Oxidation function isInteger(num) {return refind("^\d+$", num);}
better. :) –
Komsomolsk num.matches('\d+') ? num : 0;
which would default it to zero when not a sequence of numbers –
Plantagenet "^-?\d+$"
–
Jadwiga <cfif isNumeric(num) and not num contains '.'>
returns true on integer value otherwise false –
Tumefacient return refind("^-?\d+$", num) AND VAL(num) LTE 2147483647 AND VAL(num) GTE -2147483647
–
Herby Server side validation (only need the cfif
logic, loop for example only)
<cfloop list="2.123,a,4" index="myVal">
<cfif !isNumeric(myVal)> ...error code for not numeric<br />
<cfelseif myVal neq int(myVal)> ...error code for not integer<br />
<cfelse>is integer<br />
</cfif>
</cfloop>
Tighter direct code:
<cfif !isNumeric(myVal) and myVal neq int(myVal)> ...error code for not integer<br />
</cfif>
You could write a cffunction
as well
© 2022 - 2024 — McMap. All rights reserved.