为什么在Excel比较1 <或比较任何数字与任何文字与<结果为真?
在Excel 1234 > qwer = false
,但1234 < qwer = true
。 在C#中使用可为空的types,我希望这两个语句都会返回false
就像将值与空值进行比较时一样。
这背后的理由是什么? 有logging吗?
我首先想到的是,Excel内部将数字转换为string,然后比较string,但是:
'129 < '11a = false
– 当左边部分被input为文本
129 < '11a = true
– 当左边部分作为数字input时
在VBA中, variant
types比较的工作方式与电子表格中的相同
Sub CompareNumberAndText() Dim a, b, c at = "129" an = 129 b = "11a" ct = at < b 'false cn = an < b 'true End Sub
我正在开发一个类似于Excel单元格的types的库,并希望尽可能使行为尽可能接近Excel,但这些Excel比较结果是违反直觉的。 在这种情况下,我会抛出一个错误或返回false。
我可以想象一个假设的情况,当在专栏AI计算一些价值除以两个数字,例如市盈率,但负EI放在“nm”。 然后在BI列中检查P / E> some_value,我会在na上得到结果。如果练习是find昂贵的股票,那么显示负收益的股票会使一些(但是很less)感觉到,有20只股票的时候一个一个的分析。 但如果有2000个,我计算一些总量,这可能会被忽视。
您可以参考使用比较运算符比较string
根据这个at < b
的string比较,第一个字符1
的ASCII值是49
, at
和b
是相同的,但是第二个字符的ASCII值大于1
的ASCII值,因此expression式at < b
返回false
同样如比较运算符(Visual Basic)中更详细解释的那样,如果您定义了variables的基本types,那么行为会发生变化,请参阅下文
情况1:
Sub CompareNumberAndText() Dim at As String, b As String, c As String, an As Integer at = "120" an = 2 b = "1" c = "3" ct = at < b 'false cn = an < b 'false kl = an < c 'true End Sub
案例2:
Sub CompareNumberAndText() Dim at As String, b As String, an As Integer at = "120" an = 2 b = "1a" ct = at < b 'false cn = an < b 'error End Sub
在上面的情况1中,stringb
和c
被转换为double,然后与an
的值进行比较,并得到适当的布尔值,但是在情况-2中,程序无法将variablesb
转换为double值,抛出错误Run Time Error - 13, Type Mismatch
。
复制Excel对待比较的方式并不是一件简单的事情 – 您需要调查Unicode整理序列和区域设置。 有关这个问题的一些讨论,请参阅这篇博客文章,了解如何对Excel进行sorting和比较