【问题标题】:Elegant method to omit fraction formatting number if number is an integer如果数字是整数,则省略分数格式数字的优雅方法
【发布时间】:2012-12-23 19:10:26
【问题描述】:

我正在格式化浮点数,现在我有 %0.2f 格式化程序,但如果浮点数是偶数,我想省略 .00。

当然我可以考虑用字符串替换 .00,但这很粗糙。

我发现 NSNumber 的描述也做了类似的事情:

NSNumber *number = [NSNumber numberWithFloat:_paragraphSpacing];
[retString appendFormat:@"margin-bottom:%@px;", number];

这不会悬停不限制后逗号数字。如果数字是 1234.56789,那么描述会输出那个。

所以我的问题是,有没有同样简单的方法——可能不必创建 NSNumber 对象——来实现这个结果?

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    由于浮点数不精确,因此无法保证您的数字实际上是整数。但是,您可以检查它是否在距整数值相当小的距离内。当然,您不需要为此提供 NSNumber。 (一般来说,NSNumber 不用于格式化,它的目的是表示一个原始的 C 类型,无论是整数类型还是浮点类型,使用 Objective-C 对象。)

    #include <math.h>
    
    - (NSString *)stringFromFloat:(float)f
    {
        const float eps = 1.0e-6;
        if (abs(round(f) - f) < eps) {
            // assume an integer
            return [NSString stringWithFormat:@"margin-bottom: %.0fpx", round(f)];
        } else {
            // assume a real number
            return [NSString stringWithFormat:@"margin-bottom: %.2fpx", f];
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用格式化程序:

      NSNumberFormatter* formatter= [NSNumberFormatter new];
      formatter.numberStyle= NSNumberFormatterDecimalStyle;
      formatter.maximumFractionDigits=2;
      NSNumber *number = [NSNumber numberWithFloat:_paragraphSpacing];
      [retString appendFormat:@"margin-bottom:%@;", [formatter stringFromNumber: number]];
      

      【讨论】:

        【解决方案3】:

        您可以为此使用NSNumberFormatter

        static NSNumberFormatter *numberFormatter = nil;
        if (numberFormatter == nil) {
            numberFormatter = [[NSNumberFormatter alloc] init];
            numberFormatter.minimumFractionDigits = 0;
            numberFormatter.maximumFractionDigits = 2;
            numberFormatter.usesGroupingSeparator = NO;
        }
        NSString *formattedNumberString = [numberFormatter
             stringForNumber:[NSNumber numberWithDouble: _paragraphSpacing]];
        

        【讨论】:

          【解决方案4】:

          您可以使用C函数modff获取小数部分并进行测试:

          float fractionPart = 0.;
          modff(_paragraphSpacing, &fractionPart);
          if( fabsf(fractionPart) < 0.01 ) {
            // format as integer
            [retString appendFormat:@"margin-bottom:%d", (int)_paragraphSpacing];
          } else {
            // format as float
            [retString appendFormat:@"margin-bottom:%0.2f", _paragraphSpacing];
          }
          

          【讨论】:

            猜你喜欢
            • 2017-03-10
            • 2018-09-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多