Как конвертировать 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"];

Тема текст работает. Но как я могу получить NSNumberиз этого? (Я на самом деле нужно их как строки ...) Я бы преобразовать NSStringиз NSNumberтак: NSString *blah = [NSNumber intValue]. Но я не знаю, как настроить это в коде выше ...

dav3
источник
Ваш массив, кажется, на самом деле содержит словари, судя по использованию objectForKey. Таким образом, вам нужно извлечь соответствующие значения из этого, прежде чем пытаться конвертировать. Обратите внимание, что большинство типов объектов Какао, включая NSNumber, можно преобразовать в строки путем вызова descriptionметода (или использования %@в строке формата).
walkytalky
вау .. спасибо walkytalky! Можете ли вы указать мне на документацию или привести пример кода, чтобы понять ее? =)
dav3

Ответы:

380

Пытаться:

NSString *myString = [NSNumber stringValue];
JonLOo
источник
3
но вы должны взять NSNumber, который находится внутри массива, и затем вызвать метод StringValue, например, NSString * myString = [[myArray objectAtIndex: i] stringValue]; но вы должны быть уверены, что у вас есть NSNumber по этому индексу
JonLOo
Я предпочитаю descriptionWithLocale: [NSLocale currentLocale], потому что он работает как для целых чисел, так и для чисел с плавающей точкой.
just.do.it
@JonLOo при использовании этого для определенного числа десятичные значения теряют точные значения. Например: NSNumber * num = [NSNumber numberWithDouble: 48.3]; NSString * strNumber = num.stringValue; дает результаты как 48,299999; это становится критическим, если его количество и приходится иметь дело с реальным миром и умножается на большие числа. !! Есть мысли?
Виш
привет @Vish, я не пробовал это решение, поэтому я не уверен, сработает ли оно, попробуйте отформатировать его %fследующим образом: [NSString stringWithFormat:@"%f", yourDouble];
JonLOo
«Нет известного метода класса для селектора 'stringValue'» <- stringValue не является функцией класса, поэтому вы не можете вызвать ее напрямую для NSNumber. Ответ rhalgravez делает это правильно.
user1021430
13

Вы можете сделать это с:

NSNumber *myNumber = @15;
NSString *myNumberInString = [myNumber stringValue];
rhalgravez
источник
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];
fcoque
источник
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
Singhak
источник
2

В Swift 3.0

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

Мы можем получить числовое значение в String.

Гаутам Сарерия
источник