比较2个字符串(即数字)

时间:2012-04-04 00:22:13

标签: objective-c

  

可能重复:
  How to do a natural sort on an NSArray?
  Comparing version numbers

我将我的应用版本保存为NSString。版本的格式为x.y.z或x.y(其中x,y,z表示整数)。

如果我想比较两个版本(即:2个代表2个不同/相同版本的字符串),最好的方法是做什么?

谢谢!

阳光

2 个答案:

答案 0 :(得分:0)

我有同样的问题,无法使其发挥作用。我终于决定用NSNumber保存版本......为我节省了很多时间......所以我建议你做同样的事情

如果你已经在App Store中拥有该应用程序......只需执行以下操作:

NSString *string = <get version>
if ([string isKindOfClass:[NSString class]]){
update version and save as NSNumber
}

使用NSString来保存版本起初看起来似乎是一个好主意但是当你尝试更新应用程序时它很棘手。使用NSNumber更容易,因为它......好吧......使用数字

所以我浏览了NSScanner Class Reference并提出了这个解决方案:

int i1,i2,i3;
NSScanner *scanner =[NSScanner alloc]initWithString:string];
BOOL scanI1 = [scanner scanInteger:&i1];
[scanner setScanLocation:3];
BOOL scanI2 = [scanner scanInteger:&i2];
[scanner setScanLocation:5];
BOOL scanI3 = [scanner scanInteger:&i3];
[scanner release];

它不漂亮,但应该有效

答案 1 :(得分:0)

大约有一百万种方法可以解决这个问题,但这是一个简单的例子:

void versionStringComponents(NSString* versionStr_, NSInteger* major__, NSInteger* minor__, NSInteger* bugfix__)
{
    NSArray* elements = [versionStr_ componentsSeparatedByString:@"."];
    *major__ = [[elements objectAtIndex:0] intValue];
    *minor__ = [[elements objectAtIndex:1] intValue];

    *bugfix__ = 0;
    if([elements count] > 2)
    {
        *bugfix__ = [[elements objectAtIndex:2] intValue];
    }
}

bool versionLessThan(NSString* versionStr1_, NSString* versionStr2_)
{
    NSInteger major1 = 0, minor1 = 0, bugfix1 = 0;
    versionStringComponents(versionStr1_, &major1, &minor1, &bugfix1);

    NSInteger major2 = 0, minor2 = 0, bugfix2 = 0;
    versionStringComponents(versionStr2_, &major2, &minor2, &bugfix2);

    return (
        major1 < major2 ||
        (major1 == major2 && minor1 < minor2) ||
        (major1 == major2 && minor1 == minor2 && bugfix1 < bugfix2)
    );
}

显然这是一个快速的小黑客,因为versionStringComponents()只是盲目地将字符串与字符串分开,将它们变成整数等。此外,它可以使用更多的比较函数,但我确定你可以解决这些问题。

This link,作为mentioned by Saphrosit,是完成相同任务的一种更短的方式,但需要使用Sparkle框架中的代码。