代码之家  ›  专栏  ›  技术社区  ›  jowie

挑战:如何将一系列数字转换成英文可读的列表

  •  1
  • jowie  · 技术社区  · 16 年前

    我正在寻找一个很好的干净例程,用于将包含NSNumbers(整数)的NSArray转换为一个很好的英文可读字符串。例如,我想改变这一点:

    [NSArray arrayWithObjects:[NSNumber numberWithInt:5],
                              [NSNumber numberWithInt:7],
                              [NSNumber numberWithInt:12],
                              [NSNumber numberWithInt:33], nil];
    

    对此:

    5、7、12和13。

    谢谢!:)

    :-乔

    2 回复  |  直到 16 年前
        1
  •  2
  •   mvds    16 年前

    听着,妈妈,没有如果!

    NSString *seps[] = {@" and ",@"",@", ",nil,nil,@", "}, *o = @".", *sep = o;
    for ( NSNumber *n in [arr reverseObjectEnumerator] ) {
       o = [NSString stringWithFormat:@"%@%@%@",n,sep = seps[[sep length]],o];
    }
    
    NSLog(@"out: %@",o);
    

    out: 5, 7, 12 and 33.
    

    但为什么呢?

    这是一个可以理解的版本,没有“巨大的if/else构造”

    NSString *out = @"";  // no numbers = empty string
    NSString *sep = @"."; // the separator first used is actually the ending "."
    for ( NSNumber *n in [arr reverseObjectEnumerator] )
    {
        out = [NSString stringWithFormat:@"%@%@%@",n,sep,out];
        if ( [sep isEqualToString:@"."] ) // was the separator the ending "." ?
        {
            sep = @" and "; // if so, put in the last separator " and "
        } else {
            sep = @", ";    // otherwise, use separator ", "
        }
    }
    

    0 elements: ""        (i.e. empty)
    1 element:  "33."
    2 elements: "12 and 33."
    3 elements: "7, 12 and 33."
    
        2
  •  4
  •   jtbandes    16 年前
    NSArray *numbers = [NSArray arrayWithObjects:[NSNumber numberWithInt:5],
                              [NSNumber numberWithInt:7],
                              [NSNumber numberWithInt:12],
                              [NSNumber numberWithInt:33], nil];
    NSArray *first = [numbers subarrayWithRange:NSMakeRange(0, [numbers count]-1)];
    NSString *joined = [[first componentsJoinedByString:@", "] stringByAppendingFormat:(([first count] > 0) ? @"and %@" : @"%@"), [numbers lastObject]];