NSNumberFormatter 四舍五入到负零

问题描述 投票:0回答:3

我使用

NSNumberFormatter
将浮点值格式化为整数字符串,即省略小数部分。我觉得很奇怪,
(-0.5, 0)
*开区间范围内的数字最终变成了
-0
。由于这个值将显示给用户,我认为负零是不合适的。我尝试了
numberStyle
roundingMode
的各种组合,但没有成功。

有没有办法配置

NSNumberFormatter
将其输出为
0
,或者我是否必须对该范围进行手动校正?

objective-c cocoa nsnumberformatter
3个回答
2
投票

我必须自己纠正这个问题。我使用 NSNumberFormatter 显示温度,默认为

numberStyle
NSNumberFormatterNoStyle
,将数字四舍五入为整个整数,
roundingMode
设置为
NSNumberFormatterRoundHalfUp
。最后我确实截取了有问题范围内的值并自行舍入:

- (NSString *)temperature:(NSNumber *)temperature
{
    float f = [temperature floatValue];
    if (f < 0 && f > -0.5)
        temperature = [NSNumber numberWithLong:lround(f)];

    return [self.temperatureFormatter stringFromNumber:temperature];
}

1
投票

不,没有办法配置它来做到这一点。

在“10.4模式”中,NSNumberFormatter基本上只是包装CFNumberFormatter(尽管它不是直接的免费桥接包装)。您可以查看数字格式化程序属性键列表,很明显没有任何东西可以满足您的要求。 (在“10.0”模式下可能是可能的;需要一些尝试和错误才能找到答案。但我怀疑你想使用它。)

因此,预舍入(正如 Justin Boo 建议的那样)可能是您的最佳选择。

当然,您可以进行后处理。您想要做什么可能取决于您是否也想将 -0.00 渲染为 0.00,您希望不使用“-0”的本地化发生什么,等等。最简单的情况就是这样简单:

@interface NSNumberFormatter (NegativeZero)
- (NSString *)stringFromNumberNoNegativeZero:(NSNumber *)number;
@end

@implementation NSNumberFormatter (NegativeZero)
- (NSString *)stringFromNumberNoNegativeZero:(NSNumber *)number {
  NSString *s = [self stringFromNumber:number];
  if ([s isEqualToString:@"-0"]) return @"0";
  return s;
}
@end

但是如果你想要更复杂的东西,它会变得更复杂。


0
投票

我用 Swift 编写了这个字符串扩展来解决这个问题:

extension String {
    static func stringFromDouble(_ doubleValue: Double, minimumIntegerDigits: Int = 1, maximumIntegerDigits: Int = 42, minimumFractionDigits: Int = 0, maximumFractionDigits: Int = 2, roundingMode: NumberFormatter.RoundingMode = .halfUp) -> String {
        // Create number formatter
        let formatter = NumberFormatter()
        formatter.minimumIntegerDigits = minimumIntegerDigits
        formatter.maximumIntegerDigits = maximumIntegerDigits
        formatter.minimumFractionDigits = minimumFractionDigits
        formatter.maximumFractionDigits = maximumFractionDigits
        formatter.roundingMode = roundingMode
        
        // Get string
        var string = formatter.string(from: NSNumber(value: doubleValue))
        
        // Avoid "-0" which can happen with very small negative numbers
        if string == "-0" {
            string = "0"
        }
        
        return string ?? ""
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.