在 Swift 中将非常长的 Double 转换为 String
Convert very long Double to String in Swift
我想将这个数字 12345678901234567000.0 转换为字符串,所以我在扩展名下面写了。
extension Double {
var clean: String {
let formatter = NumberFormatter()
let number = NSNumber(value: self)
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 16
let cleanedString = String(formatter.string(from: number) ?? "")
if let firstLetter = cleanedString.first, firstLetter == "." {
return "0\(cleanedString)"
}
return cleanedString
}
}
let number = 12345678901234567000.0
print(number.clean) // output is 12345678901234600000
但是returns错误的数字12345678901234600000,7没了,又加了2个0
我该如何解决这个问题?
这是由于 Double
的不精确造成的。如果您使用 Decimal
,则不会 运行 进入此问题。
您也不需要该解决方法来添加前导 0
,您只需将 minimumIntegerDigits
设置为 1。您也不需要转换为 NSNumber
, NumberFormatter
有一个方法 string(for:)
接受 Swift
数字类型(例如 Double
或 Decimal
)。
extension Decimal {
static let cleanFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 16
formatter.minimumIntegerDigits = 1
return formatter
}()
var clean: String {
let cleanedString = Decimal.cleanFormatter.string(for: self) ?? ""
return cleanedString
}
}
let decimalNum = Decimal(string: "12345678901234567000.0")!
decimalNum.clean // "12345678901234567000"
decimalNum.clean == "12345678901234567000" // true
我想将这个数字 12345678901234567000.0 转换为字符串,所以我在扩展名下面写了。
extension Double {
var clean: String {
let formatter = NumberFormatter()
let number = NSNumber(value: self)
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 16
let cleanedString = String(formatter.string(from: number) ?? "")
if let firstLetter = cleanedString.first, firstLetter == "." {
return "0\(cleanedString)"
}
return cleanedString
}
}
let number = 12345678901234567000.0
print(number.clean) // output is 12345678901234600000
但是returns错误的数字12345678901234600000,7没了,又加了2个0
我该如何解决这个问题?
这是由于 Double
的不精确造成的。如果您使用 Decimal
,则不会 运行 进入此问题。
您也不需要该解决方法来添加前导 0
,您只需将 minimumIntegerDigits
设置为 1。您也不需要转换为 NSNumber
, NumberFormatter
有一个方法 string(for:)
接受 Swift
数字类型(例如 Double
或 Decimal
)。
extension Decimal {
static let cleanFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 16
formatter.minimumIntegerDigits = 1
return formatter
}()
var clean: String {
let cleanedString = Decimal.cleanFormatter.string(for: self) ?? ""
return cleanedString
}
}
let decimalNum = Decimal(string: "12345678901234567000.0")!
decimalNum.clean // "12345678901234567000"
decimalNum.clean == "12345678901234567000" // true