为啥我的 NSNumberFormatter 对象为输入 1.0 打印“2”?

Posted

技术标签:

【中文标题】为啥我的 NSNumberFormatter 对象为输入 1.0 打印“2”?【英文标题】:Why does my NSNumberFormatter object print "2" for input 1.0?为什么我的 NSNumberFormatter 对象为输入 1.0 打印“2”? 【发布时间】:2009-08-24 13:49:33 【问题描述】:

这看起来像是 API 中的一个错误:

当我的输入 CGFloat 为 0.0 时,我得到这个:

Input = 0.000000, Output = +0

当我的输入 CGFloat 为 1.0 时,我得到这个:

Input = 1.000000, Output = +2

显然这不是我想要的 ;-)

下面是我创建 NSNumberFormatter 对象的方法:

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setAlwaysShowsDecimalSeparator:NO];
    [formatter setAllowsFloats:YES];
    [formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [formatter setMinimumFractionDigits:0];
    [formatter setPlusSign:@"+"];
    [formatter setMinusSign:@"-"];
    [formatter setPositivePrefix:@"+"];
    [formatter setNegativePrefix:@"-"];
    [formatter setRoundingMode:NSNumberFormatterRoundUp];

这就是我让它格式化 1.0f 的 CGFloat 的方式:

CGFloat myValue = 1.0f;     
NSNumber *number = [NSNumber numberWithFloat:myValue];
NSLog(@"Input = %f, Output = %@", myValue, [self.inputValueFormatter stringFromNumber:number]);

这里的问题可能是roundingMode吗?我应该指定哪个?或者这种奇怪行为还有其他原因吗?

【问题讨论】:

【参考方案1】:

添加这个似乎对我有用,虽然我不确定为什么会这样:

[formatter setRoundingIncrement: [NSNumber numberWithFloat: 1]];

【讨论】:

我发现这里的舍入模式非常糟糕。我只是不圆它,它有效。我有没有提到数字格式很糟糕? 我以为你明确地想要四舍五入,即 1.1 变为 2.0。如果你想要通常的四舍五入(x.5 及以上四舍五入,其他值向下四舍五入),我认为你应该使用 NSNumberFormatterRoundHalfUp。

以上是关于为啥我的 NSNumberFormatter 对象为输入 1.0 打印“2”?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSNumberFormatter 和 RestKit 将 NSCFNumber 转换为 NSNumber 时出错

如何测试我的 NSNumberFormatter 只初始化一次?

NSNumberFormatter 在 NSCFNumber getObjectValue 上泄漏

使用 NSNumberFormatter 循环中的 Objective C 自动释放

NSNumberFormatter 货币符号

NSNumberFormatter 仅在 ipad 设备上不显示卢比符号