如何在 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
}
}
我有简单计算器的代码。
如何进行千位除法,以便在输入数字时自动用点分隔?
例如:
之前:
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
}
}