ColdFusion认为10090000000557765
= 10090000000557763
。
我明白了,但我需要知道ColdFusion知道它们不一样的最佳方法。我读到了Compare()
方法,但也返回true。我把它们作为字符串输出并返回true。
我考虑过编写一个自定义函数来将字符串分成两部分,单独比较每个部分然后返回true / false但这看起来很愚蠢。
我试过以下内容:
Val(a) EQ Val(b)
ToString(a) EQ ToString(b)
a.compareTo(b)
澄清。我正在使用我无法控制的数据库使用bigint。我很早就知道Javascript无法处理这些因此我在模型中将所有bigint字段转换为varchar。然而,现在CF有问题比较字符串,我似乎无法将它们转换回数字。
示例我刚刚做了:
<cfif '10090000000557765' EQ '10090000000557763'>
True
<cfelse>
False
</cfif>
在http://cflive.net/上,它返回true。看我的笔记。在数据库中,他们是bigint。我不得不将它们作为VarChar投射出来,因为Javascript无法处理bigint,但它确实很好。
答案 0 :(得分:10)
简答:为了不忽视显而易见的Java方法,例如Long.compareTo()返回-1
,0
或1
。确保使用正确的表达式来测试相等性。当值相等时,结果为0
。 (零(0)计算为CF中的false
。
更长的回答:
如何存储,检索和特别评估的值在这里是非常相关的。你提到的所有方法在CF11下都适合我(val
除外,原因很明显)。这表明您的代码或环境有所不同。
例如,使用CF11和SQL Server:
CREATE TABLE test
(
bigIntValue1 BIGINT
, bigIntValue2 BIGINT
, varcharValue1 VARCHAR(50)
, varcharValue2 VARCHAR(50)
)
以下测试代码:
writeOutput("<br>qry.bigIntValue1: "& val(qry.bigIntValue1) );
writeOutput("<br>qry.bigIntValue2: "& val(qry.bigIntValue2) );
writeOutput("<br>BigInt Val(): "& ( val(qry.bigIntValue1) eq val(qry.bigIntValue2)) );
writeOutput("<br>Varchar Val(): "& ( val(qry.varcharValue1) eq val(qry.varcharValue2)) );
writeOutput("<br>Long.compareTo: "& qry.bigIntValue1[1].compareTo(qry.bigIntValue2[1]));
writeOutput("<br>Varchar.compareTo: "& qry.varcharValue1[1].compareTo(qry.varcharValue2[1]));
writeOutput("<br>Compare(Long, Long) "& compare(qry.bigIntValue1, qry.bigIntValue2));
writeOutput("<br>Compare(Varchar, Varchar) "& compare(qry.varcharValue1, qry.varcharValue2));
产生以下结果:
val(qry.bigIntValue1): 1.00900000006E+016
val(qry.bigIntValue21): 1.00900000006E+016
BigInt Val(): YES
Varchar Val(): YES
Long.compareTo: 1
Varchar.compareTo: 2
Compare(Long, Long): 1
Compare(Varchar, Varchar): 1
正如预期的那样,val()
比较会返回错误的答案,因为该函数会隐式地将大数字转换为近似类型。转换后,这些近似值被认为是相等的。
所有其他比较表明值不相等。虽然这些示例使用不同的函数,但它们都有一个共同点:当值被认为相等时,它们都返回0
。其他任何表示值不同。由于零(0)在CF中被视为false
,因此请确保使用正确的表达式来测试相等性和差异。
String.compareTo() - 如果参数字符串等于此字符串,则为0;如果此字符串按字典顺序小于字符串参数,则小于0的值;如果此字符串按字典顺序大于字符串参数,则值大于0.
Compare(string1, string2) - “...对两个字符串执行区分大小写的比较。?返回-1(小于),0(相等)或1(大于)
答案 1 :(得分:3)
我有另一个简单的解决方案。我认为这对你有帮助。
TravelEntryList = $employeeTravel->Find("employee = ?
and (date(travel_date) <= ? or ? <= date(return_date))",array($employeeId,$start,$end));
当值超过其数据类型(如int,longInt等)限制时,执行算术运算会出现问题。所以我使用了PrecisionEvaluate()。