2009-11-04 7 views
12

Ich verwende NSLog() einige tabellarische Daten zu drucken, bestehend aus einem NSString und eine ganze Zahl verbunden.Ist es möglich Formatstrings zum Ausrichten von NSStrings wie Zahlen zu verwenden?

Angenommen, ich kenne die Länge des längsten Wortes.

Gibt es eine Möglichkeit Formatstrings Verwendung dieser Art von Spaltenausrichtung zu erhalten:

word:tree  rank:5 
word:frog  rank:3 
word:house  rank:2 
word:peppercorn rank:2 
word:sword  rank:2 
word:antlion  rank:1 

Der Grund, ich frage Strings ist die Formatierung Ich bin für eine leichte Art und Weise der Hoffnung um meine Ghetto-Debugging-Ausgabe zu formatieren.

Hier ist, was ich versucht:

NSString *word = @"tree"; 
NSUInteger rank = 4; 
NSString *str = [NSString stringWithFormat:@"word:%[email protected] rank:%u", word, rank]; 
NSLog(@"%@", str); 

Ergebnis:

Wort: Baum Rang: 4

Nein überhaupt Wirkung.

+1

hahaha +1 für Ghetto-Debugging-Tag – nall

Antwort

15

Das folgende scheint zu funktionieren, aber erfordert Konvertierung von Ihrem NSString in C-Zeichenfolgen.

NSString *word = @"tree"; 
NSUInteger rank = 4; 
NSString *str = [NSString stringWithFormat:@"word:%-20s rank:%u", [word UTF8String], rank]; 
NSLog(@"%@", str); 

Weiß nicht, warum die Feldbreite ignoriert wird, wenn Sie versuchen, einen NSString zu verwenden.

+0

Ja, das ist komisch. –

+0

Was haben Sie eine vollständige Zeichenfolge (z. B. 1 Item1 6 0% 6) Wie wäre das? – jongbanaag

+0

@ Anthony Cramp: Es wird nicht funktionieren, wenn String-Länge mehr ist .... Was, wenn String zu schneiden, wenn String-Länge mehr als Spaltenlänge ist ... – Nit

1

Ja, genau wie printf.

Gemäß the documentation, stringWithFormat: gehorcht der IEEE printf Spezifikation, die alle Arten von Änderungen an den einzelnen Argumenten erlaubt. Die Dokumentation enthält eine eingeschränkte Teilmenge dieser Informationen, aber sie verlinken auf die OpenGroup printf specification for Unix, um die vollständigen Informationen zu geben (eine Lektüre wert, Sie können eine Menge Tricks mit Formatbezeichnern durchführen).

diese versuchen, bekommen genau das, was Sie eingefügt haben oben:

NSString *word = @"butterfly"; 
NSUInteger rank = 4; 
NSString *str = [NSString stringWithFormat:@"word:%-11s rank:%u", [word UTF8String], rank]; 

Hier ist ein Beispiel dafür, wie ich meine Debugging-Ausgabe formatiert werden (ich verwende NSLog nicht, ich Druck auf Standardfehler wickeln zu erhalten Datei und Zeile auch):

+0

Was bekommen Sie, wenn das Wort "Baum" ist. Ich bekomme "word: tree rank: 4", was nicht auf den Spaltenbezeichner zu reagieren scheint. – willc2

+0

@ willc2: Ich habe meine Antwort mit Anthonys Informationen bearbeitet, probieren Sie es aus. –

+0

@JedSmith, darf ich wissen wie man es in Swift macht? TYIA –

0

Wenn Sie so etwas wie die frühere Antwort tun:

NSString *word = @"tree"; 
NSUInteger rank = 4; 
NSString *str = [NSString stringWithFormat:@"word:%-20s rank:%u", [word UTF8String], rank]; 
NSLog(@"%@", str); 

... Sie Encoding-Konvertierungsprobleme für Nicht-ASCII-Zeichen bekommen können ... string scheint das System Standard-Kodierung zu übernehmen, was immer noch MacRoman aus irgendeinem verrückten Grund. Sie können auf die stdlib-Ebene wechseln - machen Sie Ihre gesamte Formatierung mit sprintf in Ihren eigenen Puffer, und dann können Sie die Codierung beim Erstellen eines NSString von diesem steuern - aber das ist umständlich. Wenn jemand einen bequemen Workaround kennt, bin ich ganz Ohr.