• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iphone - 如何在Objective-C中一个数字中的部分较少的版本号上使用比较?

[复制链接]
菜鸟教程小白 发表于 2022-12-13 16:12:00 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我在 http://snipplr.com/view/2771 找到了以下代码

这非常好,几乎正是我想要的,但是如果我使用值 @"1.4.5", @"10.4" 它会产生错误的结果,说第一个数字较低。

Arghhhh 深夜编码,抱歉,我将 10.4 读作 1.4

我不确定为什么 compare 有问题,问题是什么?

/*
 * compareVersions(@"10.4",             @"10.3"); //             
       returns NSOrderedDescending (1) - aka first number is higher

 * compareVersions(@"10.5",             @"10.5.0"); //           
       returns NSOrderedSame (0) 

 * compareVersions(@"10.4 Build 8L127", @"10.4 Build 8P135"); // 
       returns NSOrderedAscending (-1) - aka first number is lower
 */
NSComparisonResult compareVersions(NSString* leftVersion, NSString* rightVersion)
{
    int i;

    // Break version into fields (separated by '.')
    NSMutableArray *leftFields  = [[NSMutableArray alloc] initWithArray:[leftVersion  componentsSeparatedByString"."]];
    NSMutableArray *rightFields = [[NSMutableArray alloc] initWithArray:[rightVersion componentsSeparatedByString"."]];

    // Implict ".0" in case version doesn't have the same number of '.'
    if ([leftFields count] < [rightFields count]) {
        while ([leftFields count] != [rightFields count]) {
            [leftFields addObject"0"];
        }
    } else if ([leftFields count] > [rightFields count]) {
        while ([leftFields count] != [rightFields count]) {
            [rightFields addObject"0"];
        }
    }

.

    // Do a numeric comparison on each field
    for(i = 0; i < [leftFields count]; i++) {
        NSComparisonResult result = [[leftFields objectAtIndex:i] compare:[rightFields objectAtIndex:i] options:NSNumericSearch];
        if (result != NSOrderedSame) {
            [leftFields release];
            [rightFields release];
            return result;
        }
    }

    [leftFields release];
    [rightFields release];  
    return NSOrderedSame;
}



Best Answer-推荐答案


[我今天早些时候发布了这个,但它没有被选为答案,它可能更适合你的问题。还有其他技巧,可以看herehere其他解决方案。]

我所做的就是将该字符串分解为组件:

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 'compareptions:' 方法,请确保您的字符串修饰得很好:

    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

关于iphone - 如何在Objective-C中一个数字中的部分较少的版本号上使用比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12308659/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap