很简单很简单的问题(字符串比较大小),可我还是被搞迷糊了! ( 积分: 50 )

  • 主题发起人 主题发起人 chuwenyong
  • 开始时间 开始时间
C

chuwenyong

Unregistered / Unconfirmed
GUEST, unregistred user!
如下代码:
if AnsiCompareText('1','-')>0 then showmessage('AnsiCompareText:1 大于 -');
if AnsiCompareText('B11-W','B1-W')>0 then showmessage('AnsiCompareText:B11-W 大于 B1-W');
if 'B11-W'>'B1-W' then ShowMessage('>:B11-W 大于 B1-W');
运行结果是:
用AnsiCompareText比较结果:'1'大于'-'
'B11-W'小于'B1-W'
用>比较结果:'B11-W'大于'B1-W'

把我搞晕了,不明白AnsiCompareText的比较机制。请各位兄弟指点迷津。感谢!
 
如下代码:
if AnsiCompareText('1','-')>0 then showmessage('AnsiCompareText:1 大于 -');
if AnsiCompareText('B11-W','B1-W')>0 then showmessage('AnsiCompareText:B11-W 大于 B1-W');
if 'B11-W'>'B1-W' then ShowMessage('>:B11-W 大于 B1-W');
运行结果是:
用AnsiCompareText比较结果:'1'大于'-'
'B11-W'小于'B1-W'
用>比较结果:'B11-W'大于'B1-W'

把我搞晕了,不明白AnsiCompareText的比较机制。请各位兄弟指点迷津。感谢!
 
你直接比较
if ('1'>'-')

('B11-W'>'B1-W')
看看结果是不是一致???
 
if AnsiCompareText('1','-')>0 then showmessage('AnsiCompareText:1 > -');
if AnsiCompareText('B11-W',' B1-W')>0 then showmessage('AnsiCompareText:B11-W > B1-W')
//在'B1-W'前加空格
if 'B11-W'>'B1-W' then ShowMessage('B11-W > B1-W');
 
首部 function AnsiCompareText(const S1, S2: string): Integer
$[SysUtils.pas
功能 反回比较两个字符串
说明 当S1>S2返回值>0;当S1<S2返回值<0;当S1=S2返回值=0;不区分大小写
参考 function Windows.CompareString
例子 SpinEdit1.Value := AnsiCompareText(Edit1.Text, Edit2.Text);
 
AnsiCompareText('B11-W',' B1-W')
该成AnsiCompareText('B1-W1',' B1-W')
就为想要的结果了:'B1-W1'大于'B1-W'
 
function AnsiCompareText(const S1, S2: string): Integer;
begin
{$IFDEF MSWINDOWS}
Result := CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, PChar(S1),
Length(S1), PChar(S2), Length(S2)) - 2;
{$ENDIF}
{$IFDEF LINUX}
Result := WideCompareText(S1, S2);
{$ENDIF}
end;

可是关于WINDOWS的实现CompareString为API函数,我没有它的资料!
 
TO:eric.youbin,
结果是一致的!
TO:xianguo,无泪
前面加一个空格结果是大于我是想得通,因为
AnsiCompareText('B',' ')是大于零的

还是无解,期待中。
 
to chuwenyong
你手头有API大全之类的资料吗?
有的话你查一下CompareString函数。

如果其他朋友有,帮看看这个函数,顺便给我一份,我来研究研究!
 
我找到了!
CompareString

VB声明
Declare Function CompareString Lib &quot;kernel32&quot
Alias &quot;CompareStringA&quot
(ByVal Locale As Long, ByVal dwCmpFlags As Long, ByVal lpString1 As String, ByVal cchCount1 As Long, ByVal lpString2 As String, ByVal cchCount2 As Long) As Long
说明
根据用于特定“地方”环境的文本对比设置,对两个字串进行比较
返回值
Long,如lpString1<lpString2,返回1;如相等,返回2;如lpString1>lpString2,则返回3。会设置GetLastError
参数表
参数 类型及说明
Locale Long,比较进行时的一个“地方”标识符
dwCmpFlags Long,带 NORM_??? 前缀的一个或多个常数,它们定义了象“忽略大小写”这样的一些选项
lpString1 String,要比较的第一个字串
cchCount1 Long,以字节为单位指定字串长度(如果是DBCS字串,则没有字符)。如设为-1,表示进行自动计算(以NULL中止字符为准)
lpString2 String,要比较的第二个字串
cchCount2 Long,第二个字串的长度(参考 cchCount1 参数说明)
注解
这个函数进行的比较要以特定的语言环境为基础,并不严格按照字符值进行比较


》》》》》》》》》》》》》》》》》
请注意这个注解里面说的:“这个函数进行的比较要以特定的语言环境为基础,并不严格按照字符值进行比较”
我想这个可能和DELPHI有关,

因AnsiCompareText调用CompareString来返回结果。
而CompareString又与“语言环境为基础”,(所以我是DELPHI)的原因。
 
TO 无泪:
先感谢一下。难得兄弟这么热心。
关于兄弟说是Delphi的原因的话,我觉得不是。

因为我出这个问题的背景是在Sql Server数据库中查数据(用Order by进行排序),然后存入一个内存表中,进行二分查找,而查找时是用'>'进行比较,结果查不到。
后来查好久,发现Sql Server的order by 是同ANSIcompareTEXT的比较顺序一样。但弄了好久都没弄明白。所以才提出这个问题
 
哪们兄弟明白这个函数到底是以什么规则在比较呀。。。
 
to chuwenyong
你的说法是order by 后就回出现哪个AnsiCompareText('B11-W','B1-W')小于0
的结果???????

如果是这样的话,那,我也不太清楚了!!
请教一些使用AnsiCompareText或order by 的高手吧!
 
TO 无泪兄:
我的意思是Sql Server里的Order by 进行字符串字段排序的话,结果是用ANSICompareTEXT一样的。也就是说,sql server里应该也是调用CompareString 进行比较。
我现在最不明白的就是,CompareString (ANSICOMPARETEXT)到底是以什么规则在比较字符串大小。
 
to chuwenyong
你说的我明白!
现在我也开始糊度了,怎么会这样??????

应该说是:
CompareString这个函数是如何把'B11-W'进行计算的!!
 
Delphi的操作符比较大小算法就是比较ASCII的大小,ASCII大的就>,有>无的方式来比较的,区分大小写。
AnsiCompareText采取的是Windows API来实现的,调用的是系统的CompareString来实现的,其调用方式如下:
Result := CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, PChar(S1),
Length(S1), PChar(S2), Length(S2)) - 2;
可以看出来是不区分大小写的。查看MSDN的说明,CompareString第二个参数为比较算法指定,默认情况下,如果没有指定某些标志,则就会按系统默认来做的,在Windows中,默认把“-”号作为标点符号进行处理,标点符号是会被忽略的,因此比较上面的数就会出现问题了,可以按下面的方式验证:
比较 B11+W 和 B1+W ,两种方式结果是一样的。
比较 B11W 和 B1W,两种方式是一样的。
说明 - 被系统作为 标点符号处理掉了,可以用下面的方式来验证我们的推测:
function AnsiCompareText(const S1, S2: string): Integer;
begin
{$IFDEF MSWINDOWS}
Result := CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE or SORT_STRINGSORT, PChar(S1),
Length(S1), PChar(S2), Length(S2)) - 2;
{$ENDIF}
{$IFDEF LINUX}
Result := WideCompareText(S1, S2);
{$ENDIF}
end;

用上面的AnsiCompareText函数处理的结果就是和Delphi比较结果一致,上面的函数多了一个标志:即把标点符号作为普通符号处理。
 
就是比较每个字符的ASIC码,我比较的结果是:
'1' > '-'
'B11-W' > 'B1-W'
不知道你是怎么比较的。
 
TO lostpen,
我怎么比较的上面有代码,不知兄台怎么比较的,代码贴出来瞧瞧如何?

TO Kingron,
有了一点明白,但还是糊涂,也用ANSICOMPARETEXT比较'-'和'1'时,为什么就会按ASCII码来比较呢?
 
糊涂ing。。。。
 
//来自:无泪, 时间:2005-8-4 17:09:56, ID:3156427
//这个函数进行的比较要以特定的语言环境为基础,并不严格按照字符值进行比较
这个语言环境并不是指的软件开发环境,而是比如中文简体/英语/西班牙语这样的语言环境,这很容易理解。
 
后退
顶部