数値と同じようにフォーマット文字列を使用して NSString を整列させることは可能ですか?

StackOverflow https://stackoverflow.com/questions/1671531

  •  13-09-2019
  •  | 
  •  

質問

使っています NSLog() から構成される表形式のデータを印刷するには、 NS文字列 そして関連する 整数.

最長の単語の長さがわかっているとします。

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

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

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

役に立ちましたか?

解決

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

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

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

他のヒント

はい、同じように printf.

によると 文書, stringWithFormat: IEEEに従う printf この仕様により、個々の引数に対するあらゆる種類の変更が可能になります。ドキュメントにはその情報の限定されたサブセットが含まれていますが、それらは次のリンクにリンクされています。 オープングループ printf Unixの仕様 完全な情報を提供します (書式指定子を使用すると多くのトリックを実行できるため、一読の価値があります)。

上に貼り付けた内容を正確に取得するには、これを試してください。

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

前の回答のようなことをすると、次のようになります。

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 を作成するときにエンコーディングを制御できますが、それは面倒です。便利な回避策を知っている人がいたら、私は大歓迎です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top