4

在 Excel 中1234 > qwer = false,但是1234 < qwer = true. 在 C# 中使用可空类型后,我希望这两个语句都返回,false就像将值与空值进行比较时一样。

这背后的理由是什么?它是否记录在某处?

我的第一个想法是 Excel 在内部将数字转换为字符串,然后比较字符串,但是:

'129 < '11a = false- 当左侧部分作为文本输入时

129 < '11a = true- 当左侧部分作为数字输入时

在 VBAvariant中,类型比较的工作方式与电子表格相同

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。

我可以想象一个假设的情况,当在 AI 列中通过将两个数字相除来计算某个值,例如市盈率,但对于负 EI,输入“nm”。然后在 BI 列中检查 P/E > some_value,如果练习是寻找昂贵的股票,那么显示负收益的股票会产生一些(但很少)意义,并且可能对进一步的手动操作有用 -当有 20 只股票时进行逐一分析。但是如果有 2000 个并且我计算了一些聚合,这可能会被忽视。

4

2 回答 2

2

您可以参考使用比较运算符比较字符串

根据 this 对于您的字符串比较at < b,第一个字符的 ASCII 值与1and相同49,但是对于第二个字符的 ASCII 值大于 的 ASCII 值,因此表达式返回atb21at < bfalse

同样如比较运算符 (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

在 Case-1 中,字符串bandc被转换为 double ,然后与 的值进行比较an,结果是正确的布尔值,但是在 Case-2 中,程序无法将变量转换b为 double 值并抛出错误Run Time Error - 13, Type Mismatch

于 2013-09-08T07:44:28.303 回答
1

复制 Excel 处理比较的方式并非易事 - 您需要研究 Unicode 整理序列和语言环境。有关问题的一些讨论,请参阅有关 Excel 方式排序和比较的博客文章

于 2013-09-09T08:04:43.920 回答