如何使用 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")
如何使用下一个规则格式化十进制值
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")