Как делать преобразования строк в Objective-C? - PullRequest
144 голосов
/ 04 октября 2008

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

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

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

Ответы [ 12 ]

228 голосов
/ 04 октября 2008

Вы можете преобразовать NSString в двойной с

double myDouble = [myString doubleValue];

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

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

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

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
70 голосов
/ 04 октября 2008

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

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

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

32 голосов
/ 04 октября 2008

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

[[NSNumber numberWithInt:myInt] stringValue]

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

7 голосов
/ 26 октября 2010

Вот рабочий пример 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 голосов
/ 04 октября 2008

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

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

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

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

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

3 голосов
/ 01 августа 2012
// 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];
2 голосов
/ 04 декабря 2012

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

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

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

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

2 голосов
/ 07 октября 2008

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

int roundedX = round(x);

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

1 голос
/ 24 февраля 2013

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

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 голос
/ 23 января 2013

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

#define STRING(value)               [@(value) stringValue]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...