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