在 Excel 中1234 > qwer = false
, but 1234 < qwer = true
。在 C# 中使用可为空类型后,我希望这两个语句都返回false
就像将值与空值进行比较时一样。
这背后的理由是什么?它记录在某处吗?
我的第一个想法是 Excel 在内部将数字转换为字符串,然后比较字符串,但随后:
'129 < '11a = false
- 当左侧部分作为文本输入时
129 < '11a = true
- 当左侧部分输入为数字时
In 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 是否为 true,n.a 为 true。如果练习是寻找昂贵的股票,那么显示负收益的股票有一定意义(但意义不大),并且在有 20 只股票时可能有助于进一步手动进行逐一分析。但如果有 2000 个并且我计算了一些总数,这可能会被忽视。
您可以参考使用比较运算符比较字符串 http://msdn.microsoft.com/en-us/library/office/aa188509(v=office.10).aspx
根据这个进行字符串比较at < b
, 第一个字符的 ASCII 值1
is 49
和同样的at
and b
,但是对于第二个字符,ASCII 值为2
大于 ASCII 值1
,因此表达式at < b
return false
也如更详细的解释比较运算符 (Visual Basic) http://msdn.microsoft.com/en-us/library/cey92b0t.aspx,如果您定义了变量的基本类型,则行为会发生变化,请参见下文
Case-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
Case-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
在 Case-1 的字符串上方b
and c
转换为 double,然后与值进行比较an
并产生正确的布尔值,但是在案例 2 中,程序无法转换变量b
为双精度值并抛出错误Run Time Error - 13, Type Mismatch
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)