Iphone Obj-C,如何处理4个零件的版本号?大于等

Iphone Obj-C,如何处理4个零件的版本号?大于等,iphone,objective-c,ios,xcode,Iphone,Objective C,Ios,Xcode,我知道这不会是一个挑战性的练习,但我想我会问一下,以防万一objective-c中已经有了一些方法 在我的应用程序中,我只处理2个版本号,例如1.5 我想升级到4个数字,最多可以有4个数字 因此,当传递数据库版本和捆绑包版本号时,我需要处理现有的数字并返回true或false 目前我只是这样做 NSString *strOnePointFive = @"1.5"; if (dblDBVersion < [strOnePointFive doubleValue]) { } NSStrin

我知道这不会是一个挑战性的练习,但我想我会问一下,以防万一objective-c中已经有了一些方法

在我的应用程序中,我只处理2个版本号,例如1.5

我想升级到4个数字,最多可以有4个数字

因此,当传递数据库版本和捆绑包版本号时,我需要处理现有的数字并返回true或false

目前我只是这样做

NSString *strOnePointFive = @"1.5";
if (dblDBVersion < [strOnePointFive doubleValue]) {

}
NSString*strOnePointFive=@“1.5”;
if(dblDBVersion<[StronePoint五倍值]){
}

我要做的是将该字符串拆分为多个组件:

NSArray *array = [myVersion componentsSeparatedByCharactersInSet:@"."];

NSInteger value = 0;
NSInteger multiplier = 1000000;
for(NSString *n in array) {
  value += [n integerValue] * multiplier;
  multiplier /= 100;
}
这样做的目的是为您提供一个可用于比较的标准化值,并且通常会比较具有不同“深度”的版本,即1.5和1.5.2

如果您有超过100个点版本(即任何数字大于100),它将中断,并将声明1.5.0==1.5。这就是说,它短,甜,简单易用

编辑:如果使用NSString“比较:选项:”方法,请确保字符串经过精心整理:

    s1 = @"1.";
    s2 = @"1";
    NSLog(@"Compare %@ to %@ result %d", s1, s2, (int)[s1 compare:s2 options:NSNumericSearch]);
    s1 = @"20.20.0";
    s2 = @"20.20";
    NSLog(@"Compare %@ to %@ result %d", s1, s2, (int)[s1 compare:s2 options:NSNumericSearch]);

2012-09-06 11:26:24.793 xxx[59804:f803] Compare 1. to 1 result 1
2012-09-06 11:26:24.794 xxx[59804:f803] Compare 20.20.0 to 20.20 result 1

我要做的是将该字符串拆分为多个组件:

NSArray *array = [myVersion componentsSeparatedByCharactersInSet:@"."];

NSInteger value = 0;
NSInteger multiplier = 1000000;
for(NSString *n in array) {
  value += [n integerValue] * multiplier;
  multiplier /= 100;
}
这样做的目的是为您提供一个可用于比较的标准化值,并且通常会比较具有不同“深度”的版本,即1.5和1.5.2

如果您有超过100个点版本(即任何数字大于100),它将中断,并将声明1.5.0==1.5。这就是说,它短,甜,简单易用

编辑:如果使用NSString“比较:选项:”方法,请确保字符串经过精心整理:

    s1 = @"1.";
    s2 = @"1";
    NSLog(@"Compare %@ to %@ result %d", s1, s2, (int)[s1 compare:s2 options:NSNumericSearch]);
    s1 = @"20.20.0";
    s2 = @"20.20";
    NSLog(@"Compare %@ to %@ result %d", s1, s2, (int)[s1 compare:s2 options:NSNumericSearch]);

2012-09-06 11:26:24.793 xxx[59804:f803] Compare 1. to 1 result 1
2012-09-06 11:26:24.794 xxx[59804:f803] Compare 20.20.0 to 20.20 result 1
这是一个,是其他格式的。以下是如何处理版本号的一些答案,这些版本号可以等于、大于或小于所需的版本号。这是这个链接的答案

NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
    isSupported = YES;
else
    isSupported = NO;
这是一个,是其他格式的。以下是如何处理版本号的一些答案,这些版本号可以等于、大于或小于所需的版本号。这是这个链接的答案

NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
    isSupported = YES;
else
    isSupported = NO;

您可以处理字符串,而不是int、float或double。@simon请参阅update@jules,当您说4位数字时,您是指例如1.5.2.3吗?或者你的意思是4组数字,例如1.5.23.067?@BlackFrog我的意思是完整的数字可能是9999.9999.9999.9999,但通常可能是1.9.1.1415请注意,你的例子对两部分数字都不正确:将版本“1.5”与版本“1.45”进行比较。你可以用字符串来处理,而不是int,浮动或双重..@simon请参见update@jules,当您说4位数字时,您是指例如1.5.2.3吗?或者你的意思是4组数字,例如1.5.23.067?@ BigF辙t,我的意思是数字可以是99999、999、999、99 99是完整的,但通常可以是1.91.1415。注意到你的例子对于2个部分数字是不正确的:比较版本“1.5”到版本“1.45”。我不知道如何把它变成一个可行的解决方案。我不会在上面浪费太多时间。我的观点是比较解决方案较短,但不是真正的“版本号”比较函数。“复制”链接中有C函数。您可能会找到大量可能的解决方案。我可能会使用比较:选项,如果我知道它时,我编码我。嗯,这给了我更多的考虑,不知道如何使这成为一个可行的解决方案。我不会浪费太多的时间。我的观点是比较解决方案较短,但不是真正的“版本号”比较函数。“复制”链接中有C函数。您可能会找到大量可能的解决方案。如果我在编码我的代码时知道,我可能会使用compare:options。但正如我所说,我不会使用带一个小数位的实际数字。但正如我所说,我不会使用带一个小数位的实际数字。