9

私は動的な文字列形式を作成しようとしてきました。これにより、ユーザーオプションを使用して、精度やパディングをユーザーがある程度定義できるようになります。

例には、24時間形式の場合のように先行ゼロのパディングが含まれます。通常の時間形式では、時間は1桁の数字、またはゼロが埋め込まれた数字で表すことができます。これは文字列形式で表されます。

...stringWithFormat:@"Hour: %02i", hour   // leading zero padded

...stringWithFormat:@"Hour: %i", hour     // not leading zero padded

私が達成したいのは、またはのいずれ@""かを含む変数を作成し、その変数をとの@"02"間のフォーマット文字列で表示することです。%i

私はいくつかの実験を行いましたが、これを行うことができないようで、では不可能だと考え始めていますstringWithFormat

私はもう試した:

...stringWithFormat:@"Hour: %%@i", padding, hour

...stringWithFormat:@"Hour: %@%i", padding, hour

その他。

何か案は?

4

3 に答える 3

34

これを行うためのより良い方法があります。

... stringWithFormat:@"Hour: %0*i", length, hour]; // note the asterisk

ここlengthで、は必要な桁数です。を使用1して先行ゼロを取得せず2、必要に応じて先行ゼロを使用して長さ2を取得するために使用します。

参考までに-最初に試したことを解決するには、2つのステップでそれを行う必要があります。

NSString *dynFmt = [NSString stringWithFormat:@"Hour: %%%@i", padding];
NSString *res = [NSString stringWithFormat:dynFmt, hour];
于 2012-12-04T04:47:17.413 に答える
4

次の2つの手順を使用します。

    NSString* hourString=nil;
    if(...){
         hourString=[NSString stringWithFormat:@"%i", hour];
    }else{
         hourString=[NSString stringWithFormat:@"%02i", hour];
    }
    NSString* result=[NSString stringWithFormat:@"Hour: %@", hourString];

以下は悪い習慣と見なされます。

    NSString* formatString=nil;
    if(...){
         formatString=@"Hour: %i";
    }else{
         formatString=@"Hour: %02i";
    }
    NSString* result=[NSString stringWithFormat:formatString, hour];

多くの種類のクラッカー攻撃で使用できる変数formatStringを持つことは非常に危険だからです。

于 2012-12-04T04:46:50.967 に答える
-1

完全に別の段階でフォーマットを構築し、それを使用できると思います。また、%の1つをエスケープして、文字通りにすることを忘れないでください。

NSString *format = [NSString stringWithFormat:@"%%%@i", padding];
NSString *result = [NSString stringWithFormat:@"Hour: %@", format]; 

更新:おっとマディの答えは私の問題を指摘しました:%をエスケープするには、\%ではなく%%を使用する必要があります。回答が更新されました。

于 2012-12-04T04:47:43.570 に答える