Як конвертувати NSNumber в NSString


132

Тож у мене є NSArray"myArray" з NSNumbers та NSStrings. Мені вони потрібні в іншому, UIViewтому я йду так:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

DetailViewController *details = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
details.subjectText = [[myArray objectAtIndex:indexPath.row] objectForKey:@"subject"];

SubjectText працює. Але як я можу отримати це NSNumberз цього? (Я на насправді потрібно їх як рядки ...) Я б перетворити NSStringз NSNumberтак: NSString *blah = [NSNumber intValue]. Але я не знаю, як це налаштувати в коді вище ...


Схоже, ваш масив містить словники, судячи з використання objectForKey. Тому вам потрібно буде витягнути з цього відповідні значення, перш ніж намагатися конвертувати. Зауважте, що більшість типів об'єктів Cocoa, включаючи NSNumber, можна перетворити на рядки, викликавши descriptionметод (або використовуючи %@в рядку формату).
walkytalky

вау .. спасибі тобі шайталки! чи можете ви вказати мені документацію або навести приклад коду, щоб зрозуміти її? =)
dav3

Відповіді:


380

Спробуйте:

NSString *myString = [NSNumber stringValue];

3
але вам слід взяти NSNumber, який знаходиться всередині масиву, а потім викликати метод StringValue, щось на зразок NSString * myString = [[myArray objectAtIndex: i] stringValue]; але ви повинні бути впевнені, що у вас є NSNumber у цьому індексі
JonLOo

Я віддаю перевагу описуWithLocale: [NSLocale currentLocale], тому що він працює як для ints, так і для floats.
just.do.it

@JonLOo при використанні цього для конкретного числа десяткові значення втрачають точні значення. Наприклад: NSNumber * num = [числоNNumber номерWithDouble: 48,3]; NSString * strNumber = num.stringValue; дає результати як 48.299999; це стає критично важливим, якщо його кількість і має справу з реальним світом та помножена на великі числа. !! Будь-яка думка?
Vish

привіт @ Віш, я не пробував це рішення, так що я не впевнений, чи воно спрацює, спробуйте відформатувати його %fтак: [NSString stringWithFormat:@"%f", yourDouble];
JonLOo

"Жоден відомий метод класу для селектора" stringValue "" <- stringValue не є функцією класу, тому ви не можете викликати його безпосередньо на NSNumber. відповідь rhalgravez робить це правильно.
користувач1021430

13

Ви можете це зробити за допомогою:

NSNumber *myNumber = @15;
NSString *myNumberInString = [myNumber stringValue];

7
//An example of implementation :
// we set the score of one player to a value
[Game getCurrent].scorePlayer1 = [NSNumber numberWithInteger:1];
// We copy the value in a NSNumber
NSNumber *aNumber = [Game getCurrent].scorePlayer1;
// Conversion of the NSNumber aNumber to a String with stringValue
NSString *StringScorePlayer1 = [aNumber stringValue];

5

або спробуйте NSString *string = [NSString stringWithFormat:@"%d", [NSNumber intValue], nil];


8
Це робить дві перетворення. Один для перетворення NSNumber в intValue, а інший для примушення отриманого intValue в NSString. Використання цього може бути невеликим для деяких, але його видалення - це прекрасний спосіб зберегти невеликі обчислювальні цикли ..., які можуть скласти.
Янн

Це передбачає, що числа, що зберігаються, є вставками. Що робити, якщо ви не знаєте тип збереженого номера?
Джеймс Вебстер

3

Найсмішніше, що NSNumber перетворюється на рядок автоматично, якщо він стає частиною рядка. Я не думаю, що це документально підтверджено. Спробуйте такі:

NSLog(@"My integer NSNumber:%@",[NSNumber numberWithInt:184]);
NSLog(@"My float NSNumber:%@",[NSNumber numberWithFloat:12.23f]);
NSLog(@"My bool(YES) NSNumber:%@",[NSNumber numberWithBool:YES]);
NSLog(@"My bool(NO) NSNumber:%@",[NSNumber numberWithBool:NO]);

NSString *myStringWithNumbers = [NSString stringWithFormat:@"Int:%@, Float:%@ Bool:%@",[NSNumber numberWithInt:132],[NSNumber numberWithFloat:-4.823f],[NSNumber numberWithBool:YES]];
NSLog(@"%@",myStringWithNumbers);

Він надрукує:

My integer NSNumber:184
My float NSNumber:12.23
My bool(YES) NSNumber:1
My bool(NO) NSNumber:0
Int:132, Float:-4.823 Bool:1

Працює як на Mac, так і на iOS

Цей не працює:

NSString *myNSNumber2 = [NSNumber numberWithFloat:-34512.23f];

2
Це задокументовано: %@специфікатор формату надішле -descriptionповідомлення відповідному об'єкту приймача. Ви можете зробити свою останню роботу лінії в тому ж дусі, написавши: NSString *myNSNumber2 = [[NSNumber numberWithFloat:-34512.23f] description];. Наскільки я можу сказати, NSNumber«S descriptionі stringValueметоди роблять те ж саме.
Жан-Деніс Муйс

2

У Swift ви можете зробити так

let number : NSNumber = 95
let str : String = number.stringValue

2

У Swift 3.0

let number:NSNumber = 25
let strValue = String(describing: number as NSNumber)
print("As String => \(strValue)")

Ми можемо отримати значення числа в String.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.