如何在 Swift 计算器中显示千位分组?

How to show thousands grouping in a Swift calculator?

我有简单计算器的代码。

如何进行千位除法,以便在输入数字时自动用点分隔?

例如:

之前:

1000000

之后:

1.000.000

计算器代码:

var stillTyping = false
var dotIsPlaced = false
var firstOperand: Double = 0
var secondOperand: Double = 0
var operationSign: String = ""
var currentInput: Double {
    get {
        return Double (displayResultLabel.text!)!
    }
    set {
        let value = "\(newValue)"
        let ValueArray = (value.components(separatedBy:"."))
        if ValueArray[1] == "0" {
            displayResultLabel.text = "\(ValueArray[0])"
        } else {
            displayResultLabel.text = "\(newValue)"
        }
        stillTyping = false
    }
}

@IBAction func numberPressed(_ sender: UIButton) {
    let number = sender.currentTitle!
    if stillTyping {
        if (displayResultLabel.text?.characters.count)! < 14 {
            displayResultLabel.text = displayResultLabel.text! + number
        }
    } else {
        displayResultLabel.text = number
        stillTyping = true
    }
}

@IBAction func twoOperandsSignPressed(sender: UIButton) {
    operationSign = sender.currentTitle!
    firstOperand = currentInput
    stillTyping = false
    dotIsPlaced = false
}

func operateWithTwoOperands(operation: (Double, Double) -> Double) {
    currentInput = operation(firstOperand, secondOperand)
    stillTyping = false
}

您应该使用此扩展程序,它适用于 NumberFormatter:

struct Number {
    static let formatterWithDots: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.groupingSeparator = "." // only include this if you want to use dots regardless of the locale
        formatter.numberStyle = .decimal
        return formatter
    }()
}

extension Double {
    var formattedWithDots: String? {
        return Number.formatterWithDots.string(from: self as NSNumber)
    }
}

用法:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChange), name: .UITextFieldTextDidChange, object: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    NotificationCenter.default.removeObserver(self)
}

@objc fileprivate func textFieldDidChange() {
    if let number = Double(textField.text ?? "") {
        textField.text = number.formattedWithDots
    }
}