Bar*_*Naz 8 cocoa-touch decimal-point objective-c nsnumberformatter
我需要最有效地在有限宽度的区域中打印浮点值.我正在使用一个NSNumberFormatter
,并且我将小数点后面的两个数字设置为默认值,这样当我有一个像234.25
它的数字一样打印时:234.25
.但是当我有1234.25
我希望它打印为:1234.3
,并且 11234.25
应该打印11234
.
我需要在该点后最多两位数,如果我在该点之后有数字,则最多总共五位数,但如果整数部分有更多,则还应打印超过五位数.
我看不到限制总位数的能力NSNumberFormatter
.这是否意味着我应该用这种方式编写自己的函数来格式化数字?如果是这样,那么获取数字的整数和小数部分中的数字位数的正确方法是什么?我也更喜欢使用CGFLoat
,而不是NSNumber
避免额外的类型转换.
Jos*_*ell 13
您正在寻找"最大有效数字"和"最大分数"的组合,以及特定的舍入行为.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]]);
Run Code Online (Sandbox Code Playgroud)
结果:
2012-04-26 16:32:04.481显着数字[11565:707] 234.25
2012-04-26 16:32:04.482显着数字[11565:707] 1234.3
2012-04-26 16:32:04.483显着数字[11565:707] 11235
这是我在代码中实现这一点的方法。不知道效率如何,希望不会太差。
所以我创建了一个全局 NSNumberFormatter
NSNumberFormatter* numFormatter;
Run Code Online (Sandbox Code Playgroud)
并在某处初始化它:
numFormatter=[[NSNumberFormatter alloc]init];
Run Code Online (Sandbox Code Playgroud)
然后我使用以下函数格式化数字:
- (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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5763 次 |
最近记录: |