Задача: как превратить NSArray чисел в список, читаемый на английском языке

Я ищу хорошую чистую рутину для превращения NSArray, содержащего NSNumbers (целые числа), в красивую строку, читаемую на английском языке. Например, я хочу изменить это:

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

в это:

5, 7, 12 и 13.

Есть ли хороший способ сделать это без отвратительной логики высказывания? Я уверен, что это можно сделать с регулярным выражением, но возможно ли это в коде pre-iOS 4?

Благодаря! :)

:-Джо

objective-c,regex,nsstring,nsarray,integer,

1

Ответов: 2


2 принят

Смотри мама, нет, если!

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.

но почему?

редактировать здесь понятная версия с не «огромным , если / иначе построить»

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."

4
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]];
Цель-с, регулярное выражение, NSString, NSArray, целое число,
Похожие вопросы