Я хочу преобразовать строку в двойную и после некоторой математики преобразовать ее обратно в строку.
Как мне сделать это в Objective-C?
Есть ли способ округлить двойное число до ближайшего целого числа?
Я хочу преобразовать строку в двойную и после некоторой математики преобразовать ее обратно в строку.
Как мне сделать это в Objective-C?
Есть ли способ округлить двойное число до ближайшего целого числа?
Ответы:
Вы можете конвертировать NSString в двойной с
double myDouble = [myString doubleValue];
Округление до ближайшего целого может тогда быть сделано как
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
Я, честно говоря, не уверен, есть ли более простой способ конвертировать обратно в строку, чем
NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
[[NSNumber numberWithInt:myInt] stringValue]
Чтобы действительно преобразовать строку в число правильно, вам нужно использовать экземпляр, NSNumberFormatter
настроенный для локали, из которой вы читаете строку.
Разные локали будут форматировать числа по-разному. Например, в некоторых частях мира COMMA
используется как десятичный разделитель, а в другихPERIOD
- разделитель тысяч (при использовании) переворачивается. За исключением случаев, когда это пробел. Или нет вообще.
Это действительно зависит от происхождения входных данных. Самое безопасное, что нужно сделать, это настроить NSNumberFormatter
способ форматирования вашего ввода и использовать его -[NSFormatter numberFromString:]
для полученияNSNumber
. Если вы хотите обрабатывать ошибки преобразования, вы можете использовать -[NSFormatter getObjectValue:forString:range:error:]
вместо этого.
Добавляя к ответу olliej, вы можете преобразовать int обратно в строку с NSNumber
's stringValue
:
[[NSNumber numberWithInt:myInt] stringValue]
stringValue
на NSNumber
вызывает descriptionWithLocale:nil
, давая вам локализованное строковое представление значения. Я не уверен, [NSString stringWithFormat:@"%d",myInt]
что даст вам правильно локализованное представление myInt
.
Метод округления Олли не подходит для отрицательных чисел
Вот альтернатива
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
Конечно, вы можете использовать функцию округления из math.h
Вот рабочий пример NSNumberFormatter, считывающий локализованное число String (xCode 3.2.4, osX 10.6), чтобы сэкономить другим часы, которые я только что потратил. Осторожно: хотя он может обрабатывать конечные пробелы, такие как «8 765,4», он не может обрабатывать начальные пробелы и не может обрабатывать символы случайного текста. (Неверные строки ввода: «8» и «8q» и «8 q».)
NSString *tempStr = @"8,765.4";
// localization allows other thousands separators, also.
NSNumberFormatter * myNumFormatter = [[NSNumberFormatter alloc] init];
[myNumFormatter setLocale:[NSLocale currentLocale]]; // happen by default?
[myNumFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
// next line is very important!
[myNumFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; // crucial
NSNumber *tempNum = [myNumFormatter numberFromString:tempStr];
NSLog(@"string '%@' gives NSNumber '%@' with intValue '%i'",
tempStr, tempNum, [tempNum intValue]);
[myNumFormatter release]; // good citizen
nil
значение, NSNumber*
если оно не может быть проанализировано. Я не могу воспроизвести ту проблему, которая была у вас с начальными пробелами и случайными текстовыми символами, IMO работает правильно. " 28.5 "
разбирает , как 28,5, и "gibberish28.5"
, "28.5gibberish"
и "gibberish28.5gibberish"
все поддается синтаксическому анализу; " 2 8 . 5. "
не разбирается, но это не необычно.
// Converting String in to Double
double doubleValue = [yourString doubleValue];
// Converting Double in to String
NSString *yourString = [NSString stringWithFormat:@"%.20f", doubleValue];
// .20f takes the value up to 20 position after decimal
// Converting double to int
int intValue = (int) doubleValue;
or
int intValue = [yourString intValue];
Для преобразования числа в строку, как насчет использования нового синтаксиса литералов (XCode> = 4.4), он немного более компактен.
int myInt = (int)round( [@"1.6" floatValue] );
NSString* myString = [@(myInt) description];
( Объединяет его как NSNumber и преобразует в строку, используя метод описания NSObjects )
из этого примера вы можете увидеть преобразования в обоих направлениях:
NSString *str=@"5678901234567890";
long long verylong;
NSRange range;
range.length = 15;
range.location = 0;
[[NSScanner scannerWithString:[str substringWithRange:range]] scanLongLong:&verylong];
NSLog(@"long long value %lld",verylong);
преобразовать текст, введенный в текстовое поле, в целое число
double mydouble=[_myTextfield.text doubleValue];
округление до ближайшего двойного
mydouble=(round(mydouble));
округление до ближайшего целого (с учетом только положительных значений)
int myint=(int)(mydouble);
преобразование из двойной в строку
myLabel.text=[NSString stringWithFormat:@"%f",mydouble];
или
NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
преобразование из int в строку
myLabel.text=[NSString stringWithFormat:@"%d",myint];
или
NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];