我想使用以下规则格式化并显示Double
:
如果有超过2个小数位数,则将其显示为6 有效数字,否则只显示其原始值至少2个小数位。
为了根据我的需要格式化数字,我使用以下方法声明了扩展名:
extension NSNumber {
func significantFormattedString(minimum: Int = 2, maximum: Int = 6) -> String {
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
formatter.minimumSignificantDigits = minimum
formatter.maximumSignificantDigits = maximum
formatter.minimumFractionDigits = 2
formatter.usesGroupingSeparator = true
formatter.minimumIntegerDigits = 1
formatter.numberStyle = .decimal
return formatter.string(from: self) ?? "-"
}
}
然后在使用以下代码进行测试时:
let myNumber = NSNumber(value: 7568.9)
let myString = myNumber.significantFormattedString()
print("\(myString)") // prints "7,568.9"
如果我注释掉指定minimumSignificantDigits
和maximumSignificantDigits
的行,它会按预期工作(即显示至少2个小数位,“7,568.90”)
有没有达到我想要的结果,或者我只能再次格式化结果?
谢谢!
答案 0 :(得分:1)
你说"如果有超过2个小数位"。一个号码不能"有" 2个小数位。您可以向数字添加无限数量的小数位(0),该值不会更改。您将实际值与格式字符串混淆。
你的真正含义可能是"如果数字的100倍是一个整数"。为此,您需要一个if语句:
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
formatter.usesGroupingSeparator = true
formatter.minimumIntegerDigits = 1
formatter.numberStyle = .decimal
// this checks if the number has two leading fractional digits that are not zero
if (a * pow(10, minimum)).truncatingRemainder(dividingBy: 1) == 0 {
formatter.minimumFractionDigits = minimum
} else {
formatter.minimumSignificantDigits = maximum
}
return formatter.string(from: self) ?? "-"