Я хочу преобразовать строку в double и после выполнения некоторой математики на ней преобразовать ее обратно в строку.
Как это сделать в Objective-C?
Есть ли способ округлить двойное до ближайшего целого?
Я хочу преобразовать строку в double и после выполнения некоторой математики на ней преобразовать ее обратно в строку.
Как это сделать в Objective-C?
Есть ли способ округлить двойное до ближайшего целого?
Вы можете преобразовать NSString в double с помощью
double myDouble = [myString doubleValue];
Округление до ближайшего int может быть выполнено как
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
Я честно не уверен, есть ли более оптимизированный способ преобразования обратно в строку, чем
NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
Чтобы действительно преобразовать строку в число правильно, вам нужно использовать экземпляр NSNumberFormatter
настроенный для локали, из которой вы читаете строку.
Разные локали будут форматировать числа по-разному. Например, в некоторых частях мира COMMA
используется как десятичный разделитель, в то время как в других это PERIOD
- и разделитель тысяч (если используется) переворачивается. За исключением случаев, когда это пробел. Или нет вообще.
Это действительно зависит от происхождения входных данных. Самое безопасное, что нужно сделать, это настроить NSNumberFormatter
для способа форматирования вашего ввода и использовать -[NSFormatter numberFromString:]
чтобы получить из него NSNumber
. Если вы хотите обрабатывать ошибки преобразования, вы можете использовать -[NSFormatter getObjectValue:forString:range:error:]
.
Добавляя к ответу olliej, вы можете преобразовать из int обратно в строку с помощью NSNumber
stringValue
:
[[NSNumber numberWithInt:myInt] stringValue]
stringValue
на NSNumber
вызывает descriptionWithLocale:nil
, предоставляя вам локализованное строковое представление значения. Я не уверен, что [NSString stringWithFormat:@"%d",myInt]
даст вам правильно локализованное представление myInt
.
olliej rounding метод неверен для отрицательных чисел
Здесь альтернатива
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
// 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];
Для округления вы должны, вероятно, использовать функции C, определенные в math.h.
int roundedX = round(x);
Удерживайте опцию и дважды щелкните по round
в Xcode, и он покажет вам справочную страницу с различными функциями для округления разных типов.
Для преобразования из числа в строку, как насчет использования синтаксиса новых литералов (XCode >= 4.4), его немного компактнее.
int myInt = (int)round( [@"1.6" floatValue] );
NSString* myString = [@(myInt) description];
(помещает его как NSNumber и преобразует в строку с помощью Метод описания NSObjects)
Это самый простой способ узнать:
float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
из этого примера здесь вы можете увидеть преобразования в обоих направлениях:
NSString *[email protected]"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);
В итоге я использовал этот удобный макрос:
#define STRING(value) [@(value) stringValue]
конвертировать текст, введенный в текстовое поле, в целое число
double mydouble=[_myTextfield.text doubleValue];
округление до ближайшего двойного
mydouble=(round(mydouble));
округление до ближайшего int (с учетом только положительных значений)
int myint=(int)(mydouble);
преобразование из double в строку
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];