【问题标题】:NSNumberFormatter rounding to negative zeroNSNumberFormatter 舍入到负零
【发布时间】:2012-05-31 16:54:41
【问题描述】:

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

有没有办法配置NSNumberFormatter 以将它们输出为0,还是我必须对该范围进行手动更正?

【问题讨论】:

    标签: objective-c cocoa nsnumberformatter


    【解决方案1】:

    我必须自己纠正这个问题。我正在使用 NSNumberFormatter 显示温度,默认为 numberStyleNSNumberFormatterNoStyle 将数字四舍五入为整数,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];
    }
    

    【讨论】:

    • 问题在于,当您应该在数字格式化程序扩展方法中本地实现此功能时,您正在调用站点上修复此问题。类似changeToZeroIfNegativeZero。这类似于String 类上的扩展方法nilIfEmpty
    【解决方案2】:

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

    在“10.4 模式”中,NSNumberFormatter 基本上只是包装 CFNumberFormatter(尽管它不是直接的免费桥接包装)。您可以查看 Number Formatter Property Keys 列表,很明显没有什么可以满足您的要求。 (在“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
    

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

    【讨论】:

    • 好的。我截取了有问题的范围内的值并自己四舍五入:float f = [number floatValue]; if (f &lt; 0 &amp;&amp; f &gt; -0.5) number = [NSNumber numberWithLong:lround(f)];
    • 请注意,此处显示的字符串操作无法正确处理所有语言环境。 0 还使用了其他符号,负值也可能使用不同的符号。你最好将数字四舍五入,让数字格式化程序完成它的工作。
    • @Palimondo:答案已经说“预舍入......可能是你最好的选择”,即使你决定进行后处理,“你想要做什么可能取决于......您希望不使用“-0”的本地化发生什么”,因此该评论不会添加任何新信息。
    • 确实如此。我想向缺乏国际化经验的开发人员强调潜在的问题。
    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多