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


145

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

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

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


В дополнение к ответу Криса Хэнсона вы можете узнать больше о средствах форматирования чисел, их поведении и строках форматирования из NSNumberFormatter в Mac OS X 10.4 в Руководстве по программированию форматирования данных для какао .
Mmalc

Еще один источник информации, который может быть полезен для вас, - это статья о NSNumberFormatter: iphonesdkarticles.com/2008/11/…
jpm

Я думаю, что официальная документация довольно хорошая ...

Ответы:


231

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

double myDouble = [myString doubleValue];

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

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

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

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

13
Вы не обязательно хотите делать это, потому что разные локали форматируют числа по-разному. Кто-то напишет «1000» за тысячу, а кто-то напишет «1000», а кто-то «1000» - что вы получаете от [NSString doubleValue]?
Крис Хэнсон

9
Double - это числовой тип данных - он не содержит форматирования. Вызов [NSString doubleValue] вернет 1000, потому что это просто число.
Энди

12
И строка NSString не может содержать число, только представление числа. Это представление может быть в любом из множества форматов, которые различаются в зависимости от региона.
Крис Хэнсон

5
Возможно, вы захотите интегрировать ответ @Barry Wark в свой,[[NSNumber numberWithInt:myInt] stringValue]
Дэн Розенстарк

1
Что если строковое значение не является допустимой двойной строкой, тогда 0,0 будет возвращено doubleValue. Мне кажется, что решение, предполагающее использование NSNumberFormatter, лучше, потому что, если строка не представляет допустимой двойной строки, то возвращается nil.
Кайделл

70

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

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

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


2
Или вы можете использовать локализованный сканер, например, созданный с помощью [NSScanner localizedScannerWithString:], а затем [scanner scanDouble: & aDouble] будет сканировать в два раза в зависимости от текущей локали пользователя.
Dreamlax

32

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

[[NSNumber numberWithInt:myInt] stringValue]

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


Спасибо, Барри. Строка NSNumber to stringValue, которую вы разместили, работала для меня, тогда как строка NSString stringWithFormat - нет.
отметьте

7

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

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

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

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

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


7

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

1
Что возвращает numberFromString, если строка не является допустимой строкой?
Бен Клейтон,

numberFromString: возвращает объект NSNumber. См. NumberFormatting и NSNumberFormatter в документах Apple. (Я не уверен, как объекты NSNumber кодируют «не число» или «неправильное число», но я вижу, что есть возможное значение NSNull.)
miker

@BenClayton numberFromString возвращает nilзначение, NSNumber*если оно не может быть проанализировано. Я не могу воспроизвести ту проблему, которая была у вас с начальными пробелами и случайными текстовыми символами, IMO работает правильно. " 28.5 "разбирает , как 28,5, и "gibberish28.5", "28.5gibberish"и "gibberish28.5gibberish"все поддается синтаксическому анализу; " 2 8 . 5. "не разбирается, но это не необычно.
JRH

3
// 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

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

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

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

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


2

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

int roundedX = round(x);

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


1

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

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

1

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

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

1

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

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

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

#define STRING(value)               [@(value) stringValue]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.