在Excel 1234 > qwer = false
中,但1234 < qwer = true
。在C#中使用可空类型之后,我希望两个语句在将值与空值进行比较时返回false
。
背后的理由是什么?它是在某处记录的吗?
我的第一个想法是Excel内部将数字转换为字符串,然后比较字符串,然后:
'129 < '11a = false
- 左侧部分作为文字输入
129 < '11a = true
- 当左侧部分作为数字输入时
在VBA中variant
类型比较的工作方式与电子表格相同
Sub CompareNumberAndText()
Dim a, b, c
at = "129"
an = 129
b = "11a"
ct = at < b 'false
cn = an < b 'true
End Sub
我正在开发一个类似于Excel单元的类型的库,并希望尽可能接近Excel的行为,但这些Excel比较结果是违反直觉的。在这种情况下,我会抛出错误或返回false。
我可以想象一个假设的情况,当在A列中我通过除以两个数来计算某个值,例如:市盈率,但对于负E,我把“n.m.”。然后在列B中检查P / E是否> some_value,我会为n.a.如果这项工作是寻找昂贵的股票,那么显示负收益的股票会产生一些(但很少)的意义,并且当有20只股票时,可以用于进一步手动逐一分析。但如果有2000个并且我计算了一些聚合,那么这可能会被忽视。
答案 0 :(得分:1)
您可以参考Comparing Strings by Using Comparison Operators
根据您的字符串比较at < b
,第一个字符1
的ASCII值为49
,at
和b
的ASCII值相同,但是对于第二个字符,2
的ASCII值大于1
的ASCII值,因此表达式at < b
返回false
同样如Comparison Operators (Visual Basic)中更详细的解释,如果您定义了变量的原始类型,行为会发生变化,请参阅下文
案例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中,字符串b
和c
被转换为double,然后与an
的值进行比较,结果产生了正确的布尔值,但是在Case中-2程序无法将变量b
转换为double值并抛出错误Run Time Error - 13, Type Mismatch
。
答案 1 :(得分:1)
复制Excel处理比较的方式并非易事 - 您需要调查Unicode整理顺序和区域设置。有关问题的一些讨论,请参阅this blog post on sorting and comparing the Excel way