Как конвертировать 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]. Но я не знаю, как настроить это в коде выше ...


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

вау .. спасибо walkytalky! Можете ли вы указать мне на документацию или привести пример кода, чтобы понять ее? =)
dav3

Ответы:


380

Пытаться:

NSString *myString = [NSNumber stringValue];

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

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.