Как конвертировать числа в текст?
Я изучал 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;
}