8

限られた幅の領域に float 値を最も効率的に出力する必要があります。私は を使用してNSNumberFormatterおり、デフォルトとして小数点の後に 2 つの数字を設定しているため、次のような数字がある234.25場合はそのまま印刷されます: 234.25. しかし、私が持っているときは、1234.25それを次のように印刷したいのですが、印刷する1234.3必要 11234.25があります11234

ポイントの後に最大 2 桁、ポイントの後に数字がある場合は全体で最大 5 桁が必要ですが、整数部分がそれ以上の場合は 5 桁以上も出力する必要があります。

の合計桁数を制限する機能がありませんNSNumberFormatter。これは、この方法で数値をフォーマットする独自の関数を作成する必要があるということですか? もしそうなら、数値の整数部分と小数部分の桁数を取得する正しい方法は何ですか? また、余分な型変換を避けるCGFLoatよりも、を使用することを好みます。NSNumber

4

4 に答える 4

15

特定の丸め動作とともに、「最大有効桁数」と「最大小数桁数」の組み合わせを探しています。NSNumberFormatterは次のタスクに等しい:

float twofortythreetwentyfive = 234.25;
float onetwothreefourtwentyfive = 1234.25;
float eleventwothreefourtwentyfive = 11234.25;

NSNumberFormatter * formatter =  [[NSNumberFormatter alloc] init];
[formatter setUsesSignificantDigits:YES];
[formatter setMaximumSignificantDigits:5];
[formatter setMaximumFractionDigits:2];
[formatter setRoundingMode:NSNumberFormatterRoundCeiling];

NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:twofortythreetwentyfive]]);
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:onetwothreefourtwentyfive]]);
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:eleventwothreefourtwentyfive]]);

結果:

2012-04-26 16:32:04.481 SignificantDigits[11565:707] 234.25
2012-04-26 16:32:04.482 SignificantDigits[11565:707] 1234.3
2012-04-26 16:32:04.483 SignificantDigits[71565:707] 11235

于 2012-04-26T16:29:00.620 に答える
1

コード :

#define INTPARTSTR(X) [NSString stringWithFormat:@"%d",(int)X]
#define DECPARTSTR(X) [NSString stringWithFormat:@"%d",(int)(((float)X-(int)X)*100)]

- (NSString*)formatFloat:(float)f
{
    NSString* result;

    result = [NSString stringWithFormat:@"%.2f",f];

    if ([DECPARTSTR(f) isEqualToString:@"0"]) return INTPARTSTR(f);
    if ([INTPARTSTR(f) length]==5) return INTPARTSTR(f);

    if ([result length]>5)
    {
        int diff = (int)[result length]-7;

        NSString* newResult = @"";

        for (int i=0; i<[result length]-diff-1; i++)
            newResult = [newResult stringByAppendingFormat:@"%c",[result characterAtIndex:i]];

        return newResult;
    }


    return result;
}

それをテストする:

- (void)awakeFromNib
{
    NSLog(@"%@",[self formatFloat:234.63]);
    NSLog(@"%@",[self formatFloat:1234.65]);
    NSLog(@"%@",[self formatFloat:11234.65]);
    NSLog(@"%@",[self formatFloat:11234]);
}

出力:

2012-04-26 19:27:24.429 newProj[1798:903] 234.63
2012-04-26 19:27:24.432 newProj[1798:903] 1234.6
2012-04-26 19:27:24.432 newProj[1798:903] 11234
2012-04-26 19:27:24.432 newProj[1798:903] 11234
于 2012-04-26T16:28:58.770 に答える
0

これが私のコードでこれをどのように実装したかです。それがどれほど効率的かはわかりませんが、悪くないことを願っています。

だから私はグローバルNSNumberFormatterを作成します

NSNumberFormatter* numFormatter; 

どこかで初期化します。

numFormatter=[[NSNumberFormatter alloc]init];

次に、次の関数を使用して数値をフォーマットします。

- (NSString*)formatFloat:(Float32)number withOptimalDigits:(UInt8)optimalDigits maxDecimals:(UInt8)maxDecimals
{
    NSString* result;
    UInt8 intDigits=(int)log10f(number)+1;
    NSLog(@"Formatting %.5f with maxDig: %d maxDec: %d intLength: %d",number,optimalDigits,maxDecimals,intDigits);  

    numFormatter.maximumFractionDigits=maxDecimals;
    if(intDigits>=optimalDigitis-maxDecimals) {
        numFormatter.usesSignificantDigits=YES;
        numFormatter.maximumSignificantDigits=(intDigits>optimalDigits)?intDigits:optimalDigits;
    } else {
        numFormatter.usesSignificantDigits=NO;
    }
    result = [numFormatter stringFromNumber:[NSNumber numberWithFloat:number]];

    return result;
}
于 2012-04-28T17:07:02.820 に答える
-1

これは、 iOS 8 でmaximumFractionDigitsand をmaximumSignificantDigits一緒に使用した場合のバグですか?NSNumberForamtter

        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        formatter.maximumFractionDigits = 2;  
        formatter.maximumSignificantDigits = 3;
        NSLog(@"%@", [formatter stringFromNumber:@(0.3333)]); // output 0.333 expected 0.33

使用するだけでうまく機能しますmaximumFractionDigits

        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        formatter.maximumFractionDigits = 2;
        NSLog(@"%@", [formatter stringFromNumber:@(0.3333)]); // output expected .33

NSNumberFormatter maximumFractionDigits および maximumSignificantDigits のバグ

于 2014-12-25T05:12:17.767 に答える