it-swarm.com.ru

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

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

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

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

144
rksprst

Вы можете конвертировать NSString в двойной с

double myDouble = [myString doubleValue];

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

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

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

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

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

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

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

70
Chris Hanson

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

[[NSNumber numberWithInt:myInt] stringValue]

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

32
Barry Wark

Вот рабочий пример 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
7
miker

метод округления Олли не подходит для отрицательных чисел

  • 2,4 округляется до 2 (метод оллиэя дает это право)
  • -2,4 округляется до -2 (метод Оллия возвращает -1)

Вот альтернатива

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

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

7
Paul Dixon
// 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];
3
Samir Jwarchan

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

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

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

(Объединяет его как NSNumber и преобразует в строку, используя метод описания NSObjects )

2
Robert

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

int roundedX = round(x);

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

2
benzado

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

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

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

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

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

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];
1
Ashish Pisey

Это самый простой способ, который я знаю:

float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
1
Sam Soffes