Як зробити перетворення рядків у 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 може бути виконано як

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

Я чесно не впевнений, чи існує більш обтічний спосіб перетворення назад у рядок, ніж

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

13
Не обов’язково робити це, оскільки різні формати локалів відрізняються по-різному. Одні напишуть "1000" на одну тисячу, а інші напишуть "1000", а інші "1.000" - з чого ви отримуєте - [NSString doubleValue]?
Кріс Гансон

9
Double - це числовий тип даних - він не містить форматування. Виклик [NSString doubleValue] поверне 1000, тому що це просто число.
Енді

12
І NSString не може містити число, а лише представлення числа. Це представлення може бути в будь-якому з різних форматів, що відрізняються між собою.
Кріс Гансон

5
ви можете інтегрувати відповідь @Barry Wark у своїх,[[NSNumber numberWithInt:myInt] stringValue]
Dan Rosenstark

1
Що робити, якщо значення рядка не є дійсним подвійним рядком, то 0,0 повернеться doubleValue. Мені здається, що рішення, що пропонує використання NSNumberFormatter, краще, тому що якщо рядок не представляє дійсної подвійної рядки, тоді нуль повертається.
Кайделл

70

Щоб реально перетворити з рядка в число належним чином, вам потрібно використовувати екземпляр, NSNumberFormatterналаштований для локальної мови, з якої ви читаєте рядок.

У різних локалях цифри будуть форматовані по-різному. Наприклад, в деяких частинах світу COMMAвикористовується як десятковий роздільник, а в інших PERIOD- і роздільник тисяч (при їх використанні) повертається назад. За винятком випадків, коли це простір. Або взагалі немає.

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


2
Або ви можете скористатися локалізованим сканером, наприклад, створеним за допомогою [NSScanner localizedScannerWithString:], а потім [сканер 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

Метод округлення olliej неправильний для від'ємних чисел

  • 2.4 закруглено 2 (метод Оллія отримує це право)
  • −2.4 закруглено −2 (метод Оллієва повертає -1)

Ось альтернатива

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

Звичайно, можна використовувати функцію округлення з математики


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 в яблучних документах. (Я не впевнений, як об’єкти 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 і двічі клацніть на roundXcode, і він покаже вам сторінку людини з різними функціями для округлення різних типів.


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 (з урахуванням лише позитивних значень)

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.