将小数格式化为在最后一个零之后有四个非零数字
Format decimals to have four non-zero digits after final zero
我想将小数格式化为在最后一个 0 之后有四个非零数字。例如,0.001765 或 0.00004839。
任何大于 1 的数字都只有两位小数。例如,2.23 .
我想知道我是否可以使用 NumberFormatter 完成此操作?
使用 maximumSignificantDigits
属性.
let nf = NumberFormatter()
nf.maximumSignificantDigits = 4
print(nf.string(for: 0.00000232323)!)
// prints 0.000002323
print(nf.string(for: 2.3)!)
// prints 2.3
你有两个条件。使用 minimumSignificantDigits
和 maximumSignificantDigits
表示 4 位数字,使用 maximumFractionDigits
表示超过 1 的 2 位。
extension FloatingPoint {
func specialFormat() -> String {
let fmt = NumberFormatter()
fmt.numberStyle = .decimal
if abs(self) >= 1 {
// adjust as needed
fmt.maximumFractionDigits = 2
} else {
fmt.minimumSignificantDigits = 4
fmt.maximumSignificantDigits = 4
}
return fmt.string(for: self)!
}
}
print(0.001765345.specialFormat())
print(0.00004839643.specialFormat())
print(1.2345.specialFormat())
输出:
0.001765
0.00004840
1.23
我结合了收到的答案/评论来最佳解决这个问题。
首先,两个必要的格式化程序通过扩展作为静态属性(如 Leo 所建议的那样)。
extension Formatter {
static let twoDecimals: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
return formatter
}()
static let fourSigDigits: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumSignificantDigits = 4
formatter.maximumSignificantDigits = 4
return formatter
}()
}
然后,有条件地应用正确格式化程序的扩展(如 rmaddy 所建议):
extension FloatingPoint {
var currencyFormat: String {
return abs(self) >= 1 ?
Formatter.twoDecimals.string(for: self) ?? "" :
Formatter.fourSigDigits.string(for: self) ?? ""
}
}
终于可以这样使用了:
let eth = 1200.123456
let xrp = 1.23456789
let trx = 0.07891234
eth.currencyFormat //"1200.12"
xrp.currencyFormat //"1.23"
trx.currencyFormat //"0.07891"
我想将小数格式化为在最后一个 0 之后有四个非零数字。例如,0.001765 或 0.00004839。
任何大于 1 的数字都只有两位小数。例如,2.23 .
我想知道我是否可以使用 NumberFormatter 完成此操作?
使用 maximumSignificantDigits
属性.
let nf = NumberFormatter()
nf.maximumSignificantDigits = 4
print(nf.string(for: 0.00000232323)!)
// prints 0.000002323
print(nf.string(for: 2.3)!)
// prints 2.3
你有两个条件。使用 minimumSignificantDigits
和 maximumSignificantDigits
表示 4 位数字,使用 maximumFractionDigits
表示超过 1 的 2 位。
extension FloatingPoint {
func specialFormat() -> String {
let fmt = NumberFormatter()
fmt.numberStyle = .decimal
if abs(self) >= 1 {
// adjust as needed
fmt.maximumFractionDigits = 2
} else {
fmt.minimumSignificantDigits = 4
fmt.maximumSignificantDigits = 4
}
return fmt.string(for: self)!
}
}
print(0.001765345.specialFormat())
print(0.00004839643.specialFormat())
print(1.2345.specialFormat())
输出:
0.001765
0.00004840
1.23
我结合了收到的答案/评论来最佳解决这个问题。
首先,两个必要的格式化程序通过扩展作为静态属性(如 Leo 所建议的那样)。
extension Formatter {
static let twoDecimals: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
return formatter
}()
static let fourSigDigits: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumSignificantDigits = 4
formatter.maximumSignificantDigits = 4
return formatter
}()
}
然后,有条件地应用正确格式化程序的扩展(如 rmaddy 所建议):
extension FloatingPoint {
var currencyFormat: String {
return abs(self) >= 1 ?
Formatter.twoDecimals.string(for: self) ?? "" :
Formatter.fourSigDigits.string(for: self) ?? ""
}
}
终于可以这样使用了:
let eth = 1200.123456
let xrp = 1.23456789
let trx = 0.07891234
eth.currencyFormat //"1200.12"
xrp.currencyFormat //"1.23"
trx.currencyFormat //"0.07891"