Wie soll ich ein int an stringWithFormat übergeben?


68

Ich versuche, stringWithFormat zu verwenden, um einen numerischen Wert für die Texteigenschaft eines Etiketts festzulegen, aber der folgende Code funktioniert nicht. Ich kann das int nicht in NSString umwandeln. Ich hatte erwartet, dass die Methode wissen würde, wie ein Int automatisch in NSString konvertiert wird.

Was muss ich hier tun?

- (IBAction) increment: (id) sender
{
    int count = 1;
    label.text = [NSString stringWithFormat:@"%@", count];
}

Antworten:


128

Mach das:

label.text = [NSString stringWithFormat:@"%d", count];

8
Dies erzeugt eine Warnung beim Kompilieren für 64-Bit-Geräte, bei denen intes sich tatsächlich um eine handelt long.
Devios1

48

Beachten Sie, dass @ "% d" nur mit 32 Bit funktioniert. Wenn Sie NSInteger aus Kompatibilitätsgründen verwenden, falls Sie jemals für eine 64-Bit-Plattform kompilieren, sollten Sie @ "% ld" als Formatbezeichner verwenden.


1
Die Verwendung %ldbeim Kompilieren für ein 32-Bit-Gerät erzeugt jetzt eine Warnung. Welcher Weg ist sicherer? Verwenden %ldmit 32 Bit oder Verwenden %dmit 64?
Devios1

1
Egal, ich sehe Squelarts Notiz über das Casting longzuerst. Das macht den Trick und kompiliert jetzt für jedes Ziel ohne Vorwarnung!
Devios1

41

Marc Charbonneau schrieb:

Beachten Sie, dass @ "% d" nur mit 32 Bit funktioniert. Wenn Sie NSInteger aus Kompatibilitätsgründen verwenden, falls Sie jemals für eine 64-Bit-Plattform kompilieren, sollten Sie @ "% ld" als Formatbezeichner verwenden.

Interessant, danke für den Tipp, ich habe @ "% d" mit meinem NSIntegers verwendet!

Die SDK - Dokumentation empfiehlt auch zu werfen , NSIntegerum longin diesem Fall (die passen @ „% ld“), zB:

NSInteger i = 42;
label.text = [NSString stringWithFormat:@"%ld", (long)i];

Quelle: String Programming Guide für Cocoa - String Format Specifiers (Registrierung des iPhone-Entwicklers erforderlich)


24

Sie möchten %doder %ifür ganze Zahlen verwenden. %@wird für Objekte verwendet.

Es ist jedoch erwähnenswert, dass der folgende Code dieselbe Aufgabe erfüllt und viel klarer ist.

label.intValue = count;

13

Und für den komödiantischen Wert:

label.text = [NSString stringWithFormat:@"%@", [NSNumber numberWithInt:count]];

(Obwohl es nützlich sein könnte, wenn Sie eines Tages mit NSNumber's zu tun haben)


3
Oder verwenden Sie die moderne Objective-C-Syntax und verwenden Sie: [NSString stringWithFormat: @ "% @", @ (count)]
Daniel Witurna


1

Ist das von Ihnen veröffentlichte Snippet nur ein Beispiel, um zu zeigen, was Sie versuchen zu tun?

Der Grund, den ich frage, ist, dass Sie eine Methode benannt haben increment, aber Sie scheinen diese zu verwenden, um den Wert einer Textbeschriftung festzulegen, anstatt einen Wert zu erhöhen.

Wenn Sie versuchen, etwas Komplizierteres zu tun, z. B. einen ganzzahligen Wert festzulegen und die Beschriftung diesen Wert anzeigen zu lassen, können Sie Bindungen verwenden. z.B

Sie deklarieren eine Eigenschaft countund Ihre incrementAktion setzt diesen Wert auf einen beliebigen Wert. Anschließend binden Sie in IB den Text der Beschriftung an den Wert von count. Solange Sie Key Value Coding (KVC) mit befolgen count, müssen Sie keinen Code schreiben, um die Anzeige des Etiketts zu aktualisieren. Und aus gestalterischer Sicht haben Sie eine lockerere Kopplung.


1

Vergiss nicht für long long int:

long long int id = [obj.id longLongValue];
[NSString stringWithFormat:@"this is my id: %lld", id]

1
NSString * formattedname;
NSString * firstname;
NSString * middlename;
NSString * lastname;

firstname = @"My First Name";
middlename = @"My Middle Name";
lastname = @"My Last Name";

formattedname = [NSString stringWithFormat:@"My Full Name: %@ %@ %@", firstname, middlename, lastname];
NSLog(@"\n\nHere is the Formatted Name:\n%@\n\n", formattedname);

/*
Result:
Here is the Formatted Name:
My Full Name: My First Name My Middle Name My Last Name
*/

0
label.text = [NSString stringWithFormat:@"%d", XYZ]; 

//result:   label.text = XYZ
//use %d for int values
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.