首页 文章

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

提问于
浏览
0

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

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

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

3 回答

  • 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

  • 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
    
  • 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"
    

相关问题