【问题标题】:String '00' equals '.0' in Coldfusion ? What else?在 Coldfusion 中,字符串 '00' 等于 '.0' 吗?还有什么?
【发布时间】:2016-07-01 14:12:41
【问题描述】:

所以我注意到 ColdFusion 针对条件 '00' == '.0' 返回 true
这可以在 CF 9.1 和 CF 10 中重现。
我可以通过添加find('.', foo) 条件轻松解决此问题,但这不正常。

这样的事情让我怀疑 ColdFusion。这让我想知道为什么它在这种明显错误的条件下返回 true,以及它认为其他哪些值是相等的?

是否存在您无法在 Coldfusion 中比较的值列表?或者更好的是,是否有防止这种不匹配的可靠解决方案?

【问题讨论】:

  • 你在开玩笑吗? '0.25' == '6A' 。为什么?因为 Coldfusion 认为 0.25 是一天的一刻钟,早上 6 点也是如此。我认为这里有一个大的WTF。
  • 试一试writeDump(compare(".0", "00")==0); CF 试图变得聪明并投射价值观,但它往往做得很糟糕。 compare 函数测试两个字符串的相等性。
  • 我不久前将其作为错误提交,他们已将其验证为错误。尽管他们这样做(模棱两可的类型表达式和字符串),但实际上记录在案 - help.adobe.com/en_US/ColdFusion/9.0/Developing/…
  • 这肯定违反了最小惊讶原则。 programmers.stackexchange.com/questions/187457/…
  • 这是使用相对无类型语言的缺点之一。 CF 以其有时 .. 离奇或 过于慷慨 的解释而闻名。因此,如果您特别需要 string 比较,则等于运算符不是正确的选择。如前所述,要执行字符串比较,请使用为此设计的函数:即compare()

标签: coldfusion duck-typing


【解决方案1】:

正如 haxtb 指出的,这里有更多关于这个问题的信息:Evaluation and type conversion issues。这是一个类型转换问题,ColdFusion 试图将短字符串值解释为日期时间、布尔值或数值而不是字符串。一些例子:

'1a'   //datetime: 1:00am
'1p'   //datetime: 1:00pm
'0.25' //datetime: a quarter of a day or 6:00am
'.0'   //boolean: false
'.0'   //numeric: 0

正如 John Wish 所说,如果您只想进行字符串比较,则应始终使用 CompareCompareNoCase() 函数。

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 2011-10-14
    • 2012-12-07
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    相关资源
    最近更新 更多