Jak przekonwertować NSNumber na NSString

132

Więc mam NSArray„myArray” z NSNumbersi NSStrings. Potrzebuję ich w innym, UIViewwięc idę tak:

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

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

Temat działa. Ale jak mogę z tego NSNumberwyjść? (I rzeczywiście trzeba je jako ciągi ...) Chciałbym przekonwertować NSStringSpośród NSNumbertak: NSString *blah = [NSNumber intValue]. Ale nie wiem, jak to ustawić w powyższym kodzie ...

dav3
źródło
Twoja tablica wydaje się zawierać słowniki, sądząc po użyciu objectForKey. Musisz więc wyodrębnić z tego odpowiednie wartości przed próbą konwersji. Zauważ, że większość typów obiektów Cocoa, w tym NSNumber, można przekonwertować na ciągi, wywołując descriptionmetodę (lub używając %@ciągu formatu).
walkytalky
wow .. dziękuję walkytalky! czy możesz wskazać mi dokumentację lub podać przykładowy kod, aby to zrozumieć? =)
dav3

Odpowiedzi:

380

Próbować:

NSString *myString = [NSNumber stringValue];
JonLOo
źródło
3
ale powinieneś wziąć numer NSNumber, który znajduje się wewnątrz tablicy, a następnie wywołać metodę StringValue, coś w rodzaju NSString * myString = [[myArray objectAtIndex: i] stringValue]; ale musisz być pewien, że masz numer NSNumber w tym indeksie
JonLOo
Wolę descriptionWithLocale: [NSLocale currentLocale], ponieważ działa zarówno dla int, jak i float.
just.do.it
@JonLOo gdy używasz tego dla określonej liczby, wartości dziesiętne tracą dokładne wartości. Na przykład: NSNumber * num = [NSNumber numberWithDouble: 48.3]; NSString * strNumber = num.stringValue; daje wyniki jako 48,299999; staje się to krytyczne, jeśli jego Kwota i ma do czynienia w prawdziwym świecie i pomnożona przez duże liczby. !! Jakiekolwiek myśli?
Vish
Cześć @ Vish, nie wypróbowałem tego rozwiązania, więc nie jestem pewien, czy zadziała, spróbuj sformatować je w %ften sposób: [NSString stringWithFormat:@"%f", yourDouble];
JonLOo
"Brak znanej metody klasy dla selektora 'stringValue'" <- stringValue nie jest funkcją klasową, więc nie można jej wywołać bezpośrednio na NSNumber. odpowiedź rhalgraveza robi to poprawnie.
user1021430
13

Możesz to zrobić za pomocą:

NSNumber *myNumber = @15;
NSString *myNumberInString = [myNumber stringValue];
rhalgravez
źródło
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
źródło
5

lub spróbuj NSString *string = [NSString stringWithFormat:@"%d", [NSNumber intValue], nil];

sbs
źródło
8
To powoduje dwie konwersje. Jeden, aby przekształcić NSNumber w intValue, a drugi, aby przekształcić wynikową wartość intValue w NSString. Korzystanie z tego może być dla niektórych niewielkie, ale usunięcie go to świetny sposób na zaoszczędzenie małych cykli obliczeniowych ... które mogą się sumować.
Jann
Zakłada się, że przechowywane liczby są ints. A jeśli nie znasz typu przechowywanej liczby?
James Webster
3

Zabawne jest to, że NSNumber konwertuje automatycznie do łańcucha, jeśli stanie się częścią łańcucha. Myślę, że nie jest to udokumentowane. Spróbuj tych:

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

Wydrukuje:

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

Działa na komputerach Mac i iOS

Ten nie działa:

NSString *myNSNumber2 = [NSNumber numberWithFloat:-34512.23f];
Tibidabo
źródło
2
Jest to udokumentowane: specyfikator %@formatu wyśle -descriptionwiadomość do odpowiedniego obiektu odbiorcy. Można zrobić ostatnią pracę linii w tym samym duchu, pisząc: NSString *myNSNumber2 = [[NSNumber numberWithFloat:-34512.23f] description];. O ile mogę powiedzieć, NSNumberdydaktycznego descriptioni stringValuemetod zrobić to samo.
Jean-Denis Muys
2

W Swift możesz to zrobić

let number : NSNumber = 95
let str : String = number.stringValue
Singhak
źródło
2

W Swift 3.0

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

Możemy uzyskać wartość liczbową w ciągu znaków.

Gautam Sareriya
źródło