ColdFusion Boolean Evaluation And #( 3 + "Yes" )# = 4
I always knew that numbers can be cast to boolean such as in:
<cfif Len( lstIDs )>
...
</cfif>
But, I had no idea that boolean values can actually evaluate to numbers. This is news to me. Apparently True values are evaluated to 1 and False values are evaluated to zero. So, the equation (3 + "Yes") evaluates to (3 + 1) which is 4. Similarly, (4 + True) evaluates to 5. (False * anything) is zero.
Crazy stuff. I am not sure when I would ever use this, but I thought I would point it out in case there were any people out there like me who never knew this was an option.
One word of caution, "Yes" gets evaluated to a boolean, but Yes, might throw an error since it stands for a variable whose name is "Yes".
Want to use code from this post? Check out the license.
Reader Comments
One thing that got me a few years ago - any non zero number is true, even negative #s!
Yeah, the negative ones I get in ColdFusion, but I am very afraid to use them in Javascript... in fact, I am scared to use numbers as booleans in Javascript at all as I am not sure if it always works. I never take the time to just sit down and test it for some reason. Like, can I do:
if ("Ben".length){ ... }
Who knows? Hopefully me one day :)
Non zero numbers (including negative) equate to True. Null strings, or in CF certain strings like "No" or "False" will return False. #( 3 + "Yes" )# = 4, but also #YesNoFormat(4)# = Yes.
It can be very useful for example if you take a string input and only want to do some action if some value was entered:
string input = getInput();
if(input){/*Put useful code here*/}
However, if("Ben".length) is like saying if(3), or if(true). In that case you might as well leave out the if statement.
This seems to be the case for any language, but of course there could be some exception to the rule.
Hope that helps
It comes in extremely handy when you are setting query or sproc parameters and need to set a null for a empty string.
Example:
<cfprocparam cfsqltype="CF_SQL_VARCHAR" value="#someString#" null="#yesNoFormat(not Len(someString))#">
@Judah,
Word up to that! And I'll do you one more - I don't believe you actually need the yesNoFormat() function. I believe the "#not len()#" should be sufficient.