Как сделать преобразования строк в Objective-C?

Я хочу преобразовать строку в double и после выполнения некоторой математики на ней преобразовать ее обратно в строку.

Как это сделать в Objective-C?

Есть ли способ округлить двойное до ближайшего целого?

Ответ 1

Вы можете преобразовать NSString в double с помощью

double myDouble = [myString doubleValue];

Округление до ближайшего int может быть выполнено как

int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

Я честно не уверен, есть ли более оптимизированный способ преобразования обратно в строку, чем

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];

Ответ 2

Чтобы действительно преобразовать строку в число правильно, вам нужно использовать экземпляр NSNumberFormatter настроенный для локали, из которой вы читаете строку.

Разные локали будут форматировать числа по-разному. Например, в некоторых частях мира COMMA используется как десятичный разделитель, в то время как в других это PERIOD - и разделитель тысяч (если используется) переворачивается. За исключением случаев, когда это пробел. Или нет вообще.

Это действительно зависит от происхождения входных данных. Самое безопасное, что нужно сделать, это настроить NSNumberFormatter для способа форматирования вашего ввода и использовать -[NSFormatter numberFromString:] чтобы получить из него NSNumber. Если вы хотите обрабатывать ошибки преобразования, вы можете использовать -[NSFormatter getObjectValue:forString:range:error:].

Ответ 3

Добавляя к ответу olliej, вы можете преобразовать из int обратно в строку с помощью NSNumber stringValue:

[[NSNumber numberWithInt:myInt] stringValue]

stringValue на NSNumber вызывает descriptionWithLocale:nil, предоставляя вам локализованное строковое представление значения. Я не уверен, что [NSString stringWithFormat:@"%d",myInt] даст вам правильно локализованное представление myInt.

Ответ 4

olliej rounding метод неверен для отрицательных чисел

  • 2.4 rounded is 2 (метод olliej получает это право).
  • -2.4 округлено -2 (метод olliej возвращает -1)

Здесь альтернатива

  int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

Конечно, вы можете использовать функцию округления от math.h

Ответ 5

Здесь рабочий образец 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

Ответ 6

// 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];

Ответ 7

Для округления вы должны, вероятно, использовать функции C, определенные в math.h.

int roundedX = round(x);

Удерживайте опцию и дважды щелкните по round в Xcode, и он покажет вам справочную страницу с различными функциями для округления разных типов.

Ответ 8

Для преобразования из числа в строку, как насчет использования синтаксиса новых литералов (XCode >= 4.4), его немного компактнее.

int myInt = (int)round( [@"1.6" floatValue] );

NSString* myString = [@(myInt) description];

(помещает его как NSNumber и преобразует в строку с помощью Метод описания NSObjects)

Ответ 9

Это самый простой способ узнать:

float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;

Ответ 10

из этого примера здесь вы можете увидеть преобразования в обоих направлениях:

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

Ответ 11

В итоге я использовал этот удобный макрос:

#define STRING(value)               [@(value) stringValue]

Ответ 12

конвертировать текст, введенный в текстовое поле, в целое число

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