首页 文章

格式化浮动以进行显示时,限制小数位数和总位数

提问于
浏览
8

我需要最有效地在有限宽度的区域中打印浮点值 . 我正在使用 NSNumberFormatter ,并且我将小数点后面的两个数字设置为默认值,这样当我有一个像 234.25 这样的数字时,它按原样打印: 234.25 . 但是当我有 1234.25 时,我希望它打印为: 1234.311234.25 应打印 11234 .

我需要在该点后最多两位数,如果我在该点之后有数字,则最多总共五位数,但如果整数部分有更多,则还应打印超过五位数 .

我认为没有能力限制 NSNumberFormatter 中的总位数 . 这是否意味着我应该用这种方式编写自己的函数来格式化数字?如果是这样,那么获取数字的整数和小数部分中的数字位数的正确方法是什么?我也更喜欢使用 CGFLoat 而不是 NSNumber 以避免额外的类型转换 .

4 回答

  • 0

    您正在寻找"maximum significant digits"和"maximum fraction digits"的组合,以及特定的舍入行为 . 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 [11565:707 ] 11235

  • 1

    Code :

    #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;
    }
    

    Testing it :

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

    Output :

    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
    
  • 13

    以下是我在代码中实现此操作的方法 . 我不知道它有多高效,我希望不错 .

    所以我创建了一个全局的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;
    }
    
  • 0

    在iOS 8上的 NSNumberForamtter 上一起使用 maximumFractionDigitsmaximumSignificantDigits 时,这是一个错误吗?

    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 and maximumSignificantDigits bug

相关问题