格式小数在最终零后具有四个非零数字

时间:2018-01-23 00:08:05

标签: ios swift number-formatting

我想格式化小数,在最后的0之后有四个非零数字。例如,0.001765或0.00004839。

任何高于1的数字都只有两位小数。例如,2.23。

我想知道我是否可以使用NumberFormatter完成此操作?

3 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分:2)

你有两个条件。对{4}位数使用minimumSignificantDigitsmaximumSignificantDigits,对于超过1的值,使用maximumFractionDigits作为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

答案 2 :(得分:0)

我使用了收到的答案/评论的组合来最佳地解决这个问题。

首先,两个必要的格式化程序通过扩展名作为静态属性(如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"