13

NSLog()を使用して、 NSStringと関連する整数で構成される表形式のデータを出力しています。

私が最長の単語の長さを知っていると仮定します。

フォーマット文字列を使用してこの種の列の配置を取得する方法はありますか?

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

文字列のフォーマットについて質問している理由は、ゲットーのデバッグ出力をフォーマットするための軽量な方法を望んでいるからです。

これが私が試したことです:

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

結果:

単語:ツリーランク:4

まったく効果はありません。

4

3 に答える 3

17

以下は機能しているようですが、NSStringからC文字列への変換が必要です。

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

NSStringを使用しようとしたときに、フィールド幅が無視される理由がわかりません。

于 2009-11-04T05:03:21.227 に答える
1

はい、のようにprintf

ドキュメントによると、stringWithFormat:はIEEEprintf仕様に準拠しており、個々の引数にあらゆる種類の変更を加えることができます。ドキュメントにはその情報の限定されたサブセットがありますが、完全な情報を提供するためにUnixのOpenGroupprintf仕様にリンクしています(読む価値があります。フォーマット指定子を使用して多くのトリックを実行できます)。

これを試して、上に貼り付けたものを正確に取得してください。

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

デバッグ出力をフォーマットする方法の例を次に示します(使用しませんNSLog。印刷を標準エラーにラップしてファイルと行も取得します)。

fprintf(stderr, "%s | %30s:%-5d | %s", [[[NSDate date] description] UTF8String],
    [fileName UTF8String], line, [body UTF8String]);
于 2009-11-04T03:37:32.063 に答える
0

前の答えのようなことをする場合:

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

...非ASCII文字のエンコーディング変換の問題が発生する可能性があります...stringWithFormatは、システムのデフォルトエンコーディングを想定しているようですが、これはなんらかの奇妙な理由でMacRomanのままです。stdlibレベルにドロップダウンして、すべてのフォーマットをsprintf独自のバッファーに入れて、そこからNSStringを作成するときにエンコードを制御できますが、これは面倒です。誰かが便利な回避策を知っているなら、私はすべての耳です。

于 2011-09-21T20:13:15.580 に答える