【问题标题】:How to convert numbers into text?如何将数字转换为文本?
【发布时间】:2015-05-13 00:29:08
【问题描述】:

我一直在通过 Kochan 的书学习 Objective-C,但我不知道如何进行这个练习程序。网上只列出了奇数的练习,而这个是偶数。练习是将数字转换为单词。所以,如果输入“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);

【问题讨论】:

  • @Nadeem 如果您的结果是“二三九”,那么您可能是从个位向上循环,而您希望从高位向下循环。请发布您的代码,我们会提供帮助。
  • 谢谢大家,我发布了代码,我没有让我以某人的名义发布这就是为什么花了这么长时间,然后我意识到我的 OP 需要其中的代码。也只是想让你们知道:我知道它为什么错了,我只是不知道如何使它正确。

标签: ios objective-c


【解决方案1】:

正是您想要的,但供您考虑:

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

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

这将记录:

nine hundred and thirty-two

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

【讨论】:

    【解决方案2】:

    由于您要将数字添加到字符串中,并且您想从右到左计算它们,因此请在字符串前面加上每个新数字。比如:

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

    【讨论】:

      【解决方案3】:
      #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 来累积结果,就像堆栈一样有效)也可以,但我认为这最接近原始吞吐量。
      • 还有什么比这更简单的吗?
      • @Nadeem。当然。你的方法适用于倒数。编写一个反转输入数字的简短函数,然后应用您的方法。我的方法将数字视为数字并抓取数字,但您也可以转换为字符串并抓取字符。我敢肯定,有很多解决方案。
      【解决方案4】:

      好吧,如果您已经能够将数字转换为单词,即使向后输出,这听起来好像您已经成功了一半。

      假设您正在遍历数据,递增索引,只需从数字的字符长度开始,向后递减索引,反转输出。

      如果没有看到您的实际代码,我们将无法为您提供更多帮助。 ;)

      【讨论】:

      • 对不起,如果我听起来像个菜鸟,我上周才开始学习:我不太明白如何才能向后工作。我目前的方法是获取正确的数字并从右到左打印。我正在尝试通过某种方式检索左侧数字来找出从左到右显示数字的方法。
      • 把代码贴在你试图完成这个任务的地方,我相信你会得到很多答案;)
      【解决方案5】:

      作为学习练习,我修改了 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;
      }
      

      【讨论】:

        【解决方案6】:
        #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;
        }
        

        【讨论】:

        • 这是我使用 Objective C 的基础知识解决这个问题的方法。花了一些时间才弄清楚,但我希望它可以帮助刚开始学习这门语言的人。
        【解决方案7】:

        我在嵌套循环下使用嵌套,但相信这可行

            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;
        

        }

        【讨论】:

          【解决方案8】:

          很简单,有很多方法,但我通常会尝试这个:

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

          【讨论】:

            猜你喜欢
            • 2019-10-21
            • 2016-12-03
            • 1970-01-01
            • 2021-05-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多