ISW*_*ISW 6 language-agnostic string comparison
任何人都可以告诉我为什么下面的字符串比较会提供这些结果?
>>"1040"<="12000"
True
>> "1040"<="10000"
False
Run Code Online (Sandbox Code Playgroud)
我已经在C和Python中尝试过字符串比较,结果显然是正确的,我只是无法弄清楚结果如何计算...
PS:我知道比较不同长度的字符串是你不应该做的事情,但我仍然想知道上述行背后的逻辑;-)
这里描述这种排序的奇特词是" 词典顺序 "(有时候是"词典顺序").在日常用语中,我们只是将其称为"字母顺序".这意味着我们首先在字母表中放置一个排序(A
,B
... Z
,等),然后比较这个字母表中的两个单词,我们一次比较一个字符,直到我们在同一个字母中找到两个不相等的字符位置并返回这两个字符之间的比较.
示例:字母表中的"自然"排序{ A, B, C, ..., Z }
是A < B < C < ... < Z
.鉴于这两个词s = s_1s_2...s_m
和t = t_1t_2...t_n
我们比较s_1
对t_1
.如果s_1 < t_1
我们这样说s < t
.如果s_1 > t_1
我们这样说s > t
.如果s_1 = t_1
我们对单词s_2...s_m
和单词进行说明t_2...t_n
.为此,我们说空字符串少于所有非空字符串.
在过去,在Unicode之前,我们的符号的排序只是ASCII字符代码的排序.那么我们就有了0 < 1 < 2 < ... < 9 < ... < A < B < C < ... Z < ... < a < b < c < ... < z
.在Unicode时代它更复杂,但同样的原则也适用.
现在,这意味着如果我们想比较1040
,12000
我们将使用以下内容:
1040
比较12000
等于040
比较2000
给出040 < 2000
因为0 < 2
最后,1040 < 12000
.
1040
比较10000
等于040
比较0000
等于40
比较000
给出40 > 000
因为4 > 0
这样,最后,1040 > 10000
.
这里的关键是这些是字符串,没有数字意义; 它们只是符号,我们对符号有一定的排序.也就是说,我们可以达到完全一样的答案,如果我们更换0
的A
,1
由B
,...,以及9
通过J
和说A < B < C < ... < J
.(在这种情况下,我们会比较BAEA
来BAAAA
和BAEA
到BCAAA
.)