-2

我有两个字符串,一个包含值“5.2.3”,另一个包含值“5.2.32”。我的问题是:如何比较这两个字符串?

if ([string1 integerValue] >= [sting2 integerValue]) 
{
            NSLog(@"process");
 }

我试过上面的线但没有得到它。

4

3 回答 3

4

那么正确的答案已经给出。因为我已经花了半个小时,所以我不想浪费它。

-(BOOL)string:(NSString*)str1 isGreaterThanString:(NSString*)str2
{
    NSArray *a1 = [str1 componentsSeparatedByString:@"."];
    NSArray *a2 = [str2 componentsSeparatedByString:@"."];

    NSInteger totalCount = ([a1 count] < [a2 count]) ? [a1 count] : [a2 count];
    NSInteger checkCount = 0;

    while (checkCount < totalCount)
    {
        if([a1[checkCount] integerValue] < [a2[checkCount] integerValue])
        {
            return NO;
        }
        else if([a1[checkCount] integerValue] > [a2[checkCount] integerValue])
        {
            return YES;
        }
        else
        {
            checkCount++;
        }
    }

    return NO;
}

你可以这样调用这个方法:-

if([self string:str1 isGreaterThanString:str2])
{
    NSLog(@"str2 is lower than the str1");
}
else
{
     NSLog(@"str1 is lower than the str2");
}
于 2013-06-29T06:58:27.767 回答
2

看起来您在这里所拥有的并不是真正的“浮点”值,而是某种多部分“数字”(类似于软件版本编号?),任何标准转换都不会涵盖,但会也不能将“正确”作为简单的字符串进行比较。

首先,您需要准确指定比较规则是什么。例如,我怀疑你想要类似的东西:

   1.2 > 1.1
   1.1.1 > 1.1
   1.11 > 1.2
   1.2.3 > 1.2.2
   1.2.22 > 1.2.3

(换句话说,用“.”分割字符串,并对每个组件进行数字比较)。您必须决定如何处理输入中出现的字母、其他分隔符等内容。例如 1.0b1 > 1.01 ?

确定规则后,编写一个方法(返回NSComparisonResult)来实现比较。如果你想变得花哨,你甚至可以在 NSString 上的一个类别中定义你的比较方法,这样你就可以做类似的事情

  if ([string1 mySuperDuperCompareTo:string2] == NSOrderedAscending) {
            NSLog(@"%@ < %@", string1, string2);
   }  // ... etc ...

另请参阅如何让 sortedArrayUsingSelector 使用整数而不是字符串进行排序?

于 2013-06-29T06:10:41.093 回答
0

@老虎是正确的。很抱歉误解了你的问题。我已经将已删除标记为我的旧答案。这是更新的。

由于有多个 . (点)这里可用的是新的解决方案。这将首先检查值,例如 5.2.3 和 5.2.32 是否存在。然后,

  • 检查第一个值 5 - 相同
  • 所以检查下一个 2 - 相同
  • 检查下一个 3 和 32 - 32 更大
  • 还要检查相同的字符串(也是概率之一)

这是逻辑-我还没有编译,但这是基本想法-可能需要一些更正

// 从.....分离 ”。”

    NSArray *arrString1 = [string1 componentSeparatedBy:@"."];  
    NSArray *arrString2 = [string1 componentSeparatedBy:@"."];

    BOOL isString1Bigger = NO; // a variable to check
    BOOL isString2Bigger = NO; // a variable to check

// check count to run loop accordingly

    if ([arrString1 count] <= [arrString2 count]) {


       for (int strVal=0; strVal<[arrString1 count]; strVal++) {

// compare strings value converted into integer format
// when you get larger then break the loop
          if([[arrString1 objectAtIndex:strVal] intValue] > [[arrString2 objectAtIndex:strVal] intValue]) {

             isString1Bigger = YES;
             break; 

       }
    }
    if ([arrString1 count] > [arrString2 count]) {

    // use arrString2 in loop and isString2Bigger as a mark
    }

// if after running both the if condition still require to check if both are same or not, for that,

if ((isString1Bigger == NO) && (isString2Bigger  == NO)) {

// same string values
}

可能需要进行一些修改才能运行。但它是比较您提供的字符串值的基本概念。

于 2013-06-29T06:18:25.033 回答