Есть ли способ в Objective-C взять число и записать его? - PullRequest
6 голосов
/ 16 июля 2011

Я ищу способ взять число (скажем, 5 или 207), записать его и вернуть его порядковый номер в виде строки (пять или двести семь).Все, что я мог найти, это код, который принимает число и возвращает его порядковый суффикс (st, nd, rd, th) и части руководств по грамматике английского языка, в которых говорится, что вы должны прописать порядковые числа.

Я ищуспособ получить записанное число с его порядковым суффиксом (пятый или двести седьмой).

Ответы [ 4 ]

10 голосов
/ 16 июля 2011

Обновление : сегодня я встречал этот ответ , предлагая использовать t его библиотеку под MIT-лицензией, которая также поддерживает Другие языки. Надеюсь, это кому-нибудь поможет.

Старый ответ:
Я написал код, который может это, но только на английском языке:

- (NSString*)getSpelledOutNumber:(NSInteger)num
{
    NSNumber *yourNumber = [NSNumber numberWithInt:(int)num];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterSpellOutStyle];
    [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en"]];
    return [formatter stringFromNumber:yourNumber];
}

- (NSString*)removeLastCharOfString:(NSString*)aString
{
    return [aString substringToIndex:[aString length]-1];
}

- (NSString*)getSpelledOutOrdinalNumber:(NSInteger)num
{    
    NSString *spelledOutNumber = [self getSpelledOutNumber:num];

    // replace all '-'
    spelledOutNumber = [spelledOutNumber stringByReplacingOccurrencesOfString:@"-"
                                                                   withString:@" "];

    NSArray *numberParts = [spelledOutNumber componentsSeparatedByString:@" "];

    NSMutableString *output = [NSMutableString string];

    NSUInteger numberOfParts = [numberParts count];
    for (int i=0; i<numberOfParts; i++) {
        NSString *numberPart = [numberParts objectAtIndex:i];

        if ([numberPart isEqualToString:@"one"])
            [output appendString:@"first"];
        else if([numberPart isEqualToString:@"two"])
            [output appendString:@"second"];
        else if([numberPart isEqualToString:@"three"])
            [output appendString:@"third"];
        else if([numberPart isEqualToString:@"five"])
            [output appendString:@"fifth"];
        else {
            NSUInteger characterCount = [numberPart length];
            unichar lastChar = [numberPart characterAtIndex:characterCount-1];
            if (lastChar == 'y')
            {
                // check if it is the last word
                if (numberOfParts-1 == i)
                { // it is
                    [output appendString:[NSString stringWithFormat:@"%@ieth ", [self removeLastCharOfString:numberPart]]];
                }
                else
                { // it isn't
                    [output appendString:[NSString stringWithFormat:@"%@-", numberPart]];
                }
            }
            else if (lastChar == 't' || lastChar == 'e')
            {
                [output appendString:[NSString stringWithFormat:@"%@th-", [self removeLastCharOfString:numberPart]]];
            }
            else
            {
                [output appendString:[NSString stringWithFormat:@"%@th ", numberPart]];
            }
        }
    }

    // eventually remove last char
    unichar lastChar = [output characterAtIndex:[output length]-1];
    if (lastChar == '-' || lastChar == ' ')
        return [self removeLastCharOfString:output];
    else
        return output;
}

Использование довольно просто:

NSString *ordinalNumber = [self getSpelledOutOrdinalNumber:42];

Число будет «сорок вторым». Я надеюсь, что это поможет вам.

5 голосов
/ 29 декабря 2013

Это должно было быть принято как правильный ответ.NSNumberFormatter сделает эту работу, и это стандартный подход, а не какой-то шаткий обходной путь.

Вот пример:

NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterSpellOutStyle];
NSString* stringFromNumber = [numberFormatter stringFromNumber:your_number_goes_here];
NSLog( @"%@", stringFromNumber );

Он выведет 'one' для 1, 'two' для 2и т.д. Кроме того, он отлично работает и для неанглийских локалей.Например, если вы измените языковой стандарт форматирования чисел на немецкий:

numberFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"DE"];

, приведенный выше код выведет: «eins» для 1, «zwei» для 2 и т. Д.

2 голосов
/ 16 июля 2011

Я однажды написал инструмент под названием vpi2english.Это часть моего vpi toolbox , написанного на языке Matlab.Но на самом деле код довольно прост и может быть преобразован в другой язык, если вы выберете.По сути, он берет (десятичную) строку цифр, разбивает ее на куски по три цифры за раз и записывает их каждый в словах.

>> vpi2english(vpi('2331546567543686356564321'))
ans =
   two septillion, three hundred thirty one sextillion,
five hundred forty six quintillion, five hundred sixty seven quadrillion,
five hundred forty three trillion, six hundred eighty six billion,
three hundred fifty six million, five hundred sixty four thousand,
three hundred twenty one 

В настоящее время он работает с числами, которые на 1 меньше 1e306, который настолько велик, насколько я мог найти имена для таких номеров в Интернете.

>> vpi2english(999999*vpi(10)^300)
ans =
nine hundred ninety nine centillion, nine hundred ninety nine novemnonagintillion
0 голосов
/ 16 июля 2011

Краткий ответ: NO

Прежде всего, это задание не относится к Objective-C как языку программирования.Во-вторых, результат должен зависеть от локали пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...