如何比较两个包含浮点值的NSStrings?

时间:2013-06-29 05:49:54

标签: iphone ios ipad

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

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

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

3 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分: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 ...

另见How to let the sortedArrayUsingSelector using integer to sort instead of String?

答案 2 :(得分:0)

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

因为有多个。这里提供的(点)是新的解决方案。这将首先检查值,如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
}

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