Как конвертировать числа в текст?

Я изучал Objective-C с книгой Кочан, и я не могу понять, как сделать эту программу упражнений. Только нечетные упражнения перечислены в Интернете, и это четное. Упражнение состоит в том, чтобы преобразовать числа в слова. Итак, если было введено "932", программа должна вернуть: "девять три два"

Я использовал do, while цикл, но слова вышли в обратном направлении, как в "два три девять". Кто-нибудь может предложить технику, которая работает для этого?

int number, digit;


NSLog(@"Type in your integer.");
scanf("%i", &number);


 do
 {
     digit = number % 10;

     if (digit == 0)
         NSLog(@"zero");
     if (digit == 1)
         NSLog(@"one");
     if (digit == 2)
         NSLog(@"two");
     if (digit == 3)
         NSLog(@"three");
     if (digit == 4)
         NSLog(@"four");
     if (digit == 5)
         NSLog(@"five");
     if (digit == 6)
         NSLog(@"six");
     if (digit == 7)
         NSLog(@"seven");
     if (digit == 8)
         NSLog(@"eight");
     if (digit == 9)
         NSLog(@"nine");

     number /= 10;
 }
while (number != 0);

8 ответов

Это не совсем то , что вы хотите, но для вашего рассмотрения:

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterSpellOutStyle];

NSString *s = [f stringFromNumber:[NSNumber numberWithInt:932]];
NSLog(@"%@", s);
[f release];

Это войдет:

nine hundred and thirty-two

Опять же, это не "девять три два", которые вы хотите, но это также красиво и коротко.:)

Поскольку вы добавляете числа в строку и хотите вычислить их справа налево, добавляйте строку с каждым новым числом. Что-то вроде:

numberString = [NSString stringWithFormat:@"%@ %@", theNewNumber, numberString];

Где theNewNumber - это строка (например, @"six"), а numberString - это строка, которую вы хотите вывести после завершения...

(о, и не забудьте инициализировать numberString перед началом цикла... что-то вроде:

NSString *numberString = @"";

=====

Основываясь на только что опубликованном коде, вы можете сделать это математически или просто предварительно добавить строку, подобную этой:

Поместите эту переменную в ваш файл.h:

NSString *numberString;

Затем поместите это в свой.m:

- (void) prependNumber:(NSString *)num {
  numberString = [NSString stringWithFormat:@"%@ %@", num, numberString];
}

NSLog(@"Type in your integer.");
scanf("%i", &number);
numberString = @"";


 do
 {
     digit = number % 10;

     if (digit == 0)
         [self prependNumber:@"zero"];
     if (digit == 1)
         [self prependNumber:@"one"];
     if (digit == 2)
         [self prependNumber:@"two"];
     if (digit == 3)
         [self prependNumber:@"three"];
     if (digit == 4)
         [self prependNumber:@"four"];
     if (digit == 5)
         [self prependNumber:@"five"];
     if (digit == 6)
         [self prependNumber:@"six"];
     if (digit == 7)
         [self prependNumber:@"seven"];
     if (digit == 8)
         [self prependNumber:@"eight"];
     if (digit == 9)
         [self prependNumber:@"nine"];

     number /= 10;
 }
while (number != 0);

NSLog (@"%@", numberString);
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int a, b, number, logNum, nThNum;

    NSLog(@"Please enter a valid integer: ");
    scanf("%d", &number); // read input as a decimal integer

    if (!number) // if zero or something other than a number is entered output zero
        NSLog(@"Zero");
    else if (number < 0) { // convert negatives to something that can be used
        number = -number;
        NSLog(@"(negative)"); // but output negative first then continue as usual
    }

    logNum = (log10(number) + 1); // find how many digits there are in the number

    for (int j=0; j < logNum; j++) {// loop based on number of digits
        a = pow(10,logNum-j);
        b = pow(10,logNum-1-j);
        nThNum = (number % a) / b;// find the nth digit in a number, in our case 1st
        switch (nThNum) {// output current digit that was found
            case 0:
                NSLog(@"Zero");
                break;
            case 1:
                NSLog(@"One");
                break;
            case 2:
                NSLog(@"Two");
                break;
            case 3:
                NSLog(@"Three");
                break;
            case 4:
                NSLog(@"Four");
                break;
            case 5:
                NSLog(@"Five");
                break;
            case 6:
                NSLog(@"Six");
                break;
            case 7:
                NSLog(@"Seven");
                break;
            case 8:
                NSLog(@"Eight");
                break;
            case 9:
                NSLog(@"Nine");
                break;
            default:
                break;
        }
    }

    [pool drain];
    return 0;
}

Итак, теперь, когда вы разместили свой код, ваш метод будет отлично работать, если вы сначала поменяете число. Таким образом, вы можете просто написать короткую процедуру, чтобы сделать это, а затем использовать свой собственный код.

Ну, это звучит так, будто вы на полпути, если вы уже смогли получить числа для преобразования в слова, даже если выводите в обратном направлении.

Предполагая, что вы просматриваете свои данные, увеличиваете индекс, просто начинайте с длины символа числа, уменьшая индекс в обратном порядке, обращая вспять свои выходные данные.

Мы не можем помочь вам намного больше, не увидев ваш реальный код.;)

В качестве учебного упражнения я изменил код Дэйва:

+(NSString*)doIt:(NSString*)inString delimiter:(NSString*)delimiter{
    NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterSpellOutStyle];
    NSMutableString* outString= [[NSMutableString alloc]init];
    for (int i=0; i< [inString length]; i++) {
        unsigned char oneChar= [inString characterAtIndex:i];
        if (oneChar>47 && oneChar<58) {
            NSString* temp=[f stringFromNumber:[NSNumber numberWithUnsignedChar:oneChar-48]];
            [outString appendFormat:@"%@",temp];
            [outString appendString:delimiter];
        }
    }
    [f release];
    [outString autorelease];
    return outString;
}

Очень легко, есть несколько подходов, но я обычно пробую это:

  do
    {
         digit = number % 10;
        switch (digit) {
            case 0:
                [self prependNumber:@"zero"];
                break;
            case 1:
                [self prependNumber:@"one"];
                break;
            case 2:
                [self prependNumber:@"two"];
                break;
            case 3:
                [self prependNumber:@"three"];
                break;
            case 4:
                [self prependNumber:@"four"];
                break;
            case 5:
                [self prependNumber:@"five"];
                break;
            case 6:
                [self prependNumber:@"six"];
                break;
            case 7:
                [self prependNumber:@"seven"];
                break;
            case 8:
                [self prependNumber:@"eight"];
                break;
            case 9:
                [self prependNumber:@"nine"];
                break;
            default:
                break;
        }


        number /= 10;
    }
    while (number != 0);

/************/
-(void) prependNumber:(NSString*)str{
 NSLog(str);
}

Я использую вложенный цикл, но считаю, что это работает

    int i, j, number, reversenumber = 0;

    NSLog(@" Input Number:");
    scanf( "%i", &number);

    if (number != 0)
        // chekcing for zero entry
    {
        for (;number!= 0; number = number/10)
            //for reversing the number entered so that the words doesn't come reversed when printed
        {
            i = number%10;
            reversenumber = reversenumber * 10 + i;
        }

        NSLog(@"Reverser Number for the input number is %i", reversenumber);
        // mid routine check to print the reversed number

        while(reversenumber != 0)
        {
            j = reversenumber % 10;
            switch (j)
            {
                case 9:
                    NSLog(@"nine");
                    break;
                case 8:
                    NSLog(@"eight");
                    break;
                case 7:
                    NSLog(@"seven");
                    break;
                case 6:
                    NSLog(@"six");
                    break;
                case 5:
                    NSLog(@"five");
                    break;
                case 4:
                    NSLog(@"four");
                    break;
                case 3:
                    NSLog(@"three");
                    break;
                case 2:
                    NSLog(@"two");
                    break;
                case 1:
                    NSLog(@"one");
                    break;
                default:
                    NSLog(@"zero");
            }
            reversenumber /= 10;
        }

    }
    else
        NSLog(@"Zero");
}

    return 0;

}

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

@autoreleasepool {

    // insert code here...
    int number;     //store the value the user enter
    int lastDigit;  //pick of the last digit of the integer
    int tempNum;    //a temporary storage of the integer the user enter
    int count = 0;  //used to count how many digits were entered
    int count2;     //going to be use as a duplicate of count



    NSLog(@"Enter an integer");
    scanf("%i", &number);
    tempNum = number;


    //Loop to find out how many digits were entered
    for (; number != 0; number /= 10) {
        count +=1;
        }

    //Loop to convert the numbers into words
    for (; count != 0; count -= 1) {
        count2 = count;     //set count2 to count so the for and while loop use them independently
        number = tempNum;   //restore the value entered by by the user to the number variable


        //Loop to reverse the order of the last digit

        while (count2 != 0) {           //loops to the same number of counts to get the first digit
            lastDigit = number % 10;    //picks off the last value in the integer
            number /= 10;               //enables the loop to set the last value of the integer to zero
            count2 -=1;                 //loops one less time to get the numbers from front to back

        }
        //switch statements
        switch (lastDigit) {
            case 9:
                NSLog(@"nine");
                break;
            case 8:
                NSLog(@"eight");
                break;
            case 7:
                NSLog(@"seven");
                break;
            case 6:
                NSLog(@"six");
                break;
            case 5:
                NSLog(@"five");
                break;
            case 4:
                NSLog(@"four");
                break;
            case 3:
                NSLog(@"three");
                break;
            case 2:
                NSLog(@"two");
                break;
            case 1:
                NSLog(@"one");
                break;
            case 0:
                NSLog(@"zero");
                break;
            default:
                break;
        }
    }
   }
return 0;
}
Другие вопросы по тегам