如何将数字转换为文本?

我一直在用Kochan的书学习Objective-C,我不知道如何做这个练习程序。 网上只列出奇数练习,这个是偶数。 练习是将数字转换成单词。 所以,如果input“932”,程序应该返回:“九三二”

我用了一个dowhile循环,但是这个词倒退了,就像“二三九”中那样。 任何人都可以提出一个适用于此的技术?

 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); 

这不完全是你想要的,但为了你的考虑:

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

这将logging:

 nine hundred and thirty-two 

再一次,这不是你想要的“九二三”,但也是很好,很短。 🙂

由于您将数字添加到string,并且要从右到左计算它们,请在每个新数字前加上string。 就像是:

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

其中,NewNumber是一个string(如@“six”),numberString是一旦完成后要输出的string。

(哦,不要忘了在开始循环之前初始化numberString …例如:

 NSString *numberString = @""; 

=====

根据你刚才发布的代码,你可以用math方法来完成,或者只是预先设置一个string:

把这个variables放在你的.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; } 

那么,现在你已经发布了你的代码,你的方法会很好,如果你第一次倒转数字。 所以,你可以写一个简短的例程来做到这一点,然后使用自己的代码。

那么,如果你已经能够将数字转换成单词,那么这听起来就像是你的一半,即使是向后输出。

假设你循环你的数据,递增索引,只需从数字的字符长度开始,向后递减索引,反转输出。

没有看到您的实际代码,我们无法帮助您。 ;)

作为一个学习练习,我修改了Dave的代码:

 +(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; } 
 #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; } 

我使用嵌套循环嵌套,但相信这个工程

  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; 

}

很容易,有很多方法,但我通常尝试这个:

  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); }