如何使用NSNumberFormatter截断分数

时间:2016-06-21 06:39:30

标签: ios nsnumberformatter

如何使用下一个规则格式化十进制值

0.12345    => 0.12
10.12345   => 10.12
100.12345  => 100.1
1000.12345 => 1,000

请注意,这个想法是占用相同的空间。 C样式printf允许使用4.2%f加上某种千位分隔符来执行此操作,但我不知道如何在Cocoa中反映它。

更新

如果您没有注意到示例说0.12345转换为0.12而不是0.1234

2 个答案:

答案 0 :(得分:1)

由于NSNumberFormatter在启用重要模式时忽略maximumFractionDigits,因此我创建了自定义类

class TRNumberFormatter: NSNumberFormatter {

    override func stringFromNumber(number: NSNumber) -> String? {
        let digitsCount = "\(number.integerValue)".characters.count
        let value = self.Tround(number.doubleValue, precision: min(self.maximumIntegerDigits - digitsCount, self.maximumFractionDigits))
        return super.stringFromNumber(value)
    }

    func Tround(value: Double, precision: Int) -> Double {
        let divisor = pow(10.0, Double(precision))
        return round(value * divisor) / divisor
    }    
}

仅使用它

var numberFormatter: NSNumberFormatter = TRNumberFormatter()
numberFormatter.usesGroupingSeparator = true
numberFormatter.maximumIntegerDigits = 4
numberFormatter.minimumIntegerDigits = 1
numberFormatter.maximumFractionDigits = 2

结果

print(numberFormatter.stringFromNumber(0.12345)) // Optional("0.12")
print(numberFormatter.stringFromNumber(10.12345)) // Optional("10.12")
print(numberFormatter.stringFromNumber(100.12345)) // Optional("100.1")
print(numberFormatter.stringFromNumber(1000.12345)) // Optional("1,000")

答案 1 :(得分:0)

这很接近:

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
        nf.usesSignificantDigits = YES;
        nf.maximumSignificantDigits = 4;
        nf.usesGroupingSeparator = YES;
        NSLog(@"%@", [nf stringFromNumber:@(10.23455)]);
    }
}

但是它忽略了OP想要的最多2个小数位,并且设置maximumFractionDigits=2不起作用

在我看来,我们无法模仿这个4.2%的确切...而没有对整个事物进行子类化