如何使用 NSNumberFormatter 截断分数

How to truncate fraction using NSNumberFormatter

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

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

请注意,想法是采用相同的 space。 C 风格 printf 允许使用某些东西 4.2%f 加上千位分隔符来做到这一点,但我不知道如何在 Cocoa.

中反映它

更新

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

这很接近:

#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%f

因为 NSNumberFormatter 忽略 maximumFractionDigits 启用显着模式时我创建了自定义 class

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")