How to input currency format on a text field (from right to left) using Swift?

前端 未结 9 1001
甜味超标
甜味超标 2020-11-22 01:57

I have a number let’s say 0.00.

  • When the user taps 1. We should have 0.01
  • When the user taps 2. We should display 0.
9条回答
  •  囚心锁ツ
    2020-11-22 02:41

    Thanks to everyone here. From all the answers here I managed to come out with mine.

    First I set up the initial value of the textField to be:

    private func commonInit() { 
        amountTextField.text = "0.00"
    }
    

    Then I use the UITextFieldDelegate to get the input value and the current textview.text:

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        //Need to check if the textfield.text can be evaluated as number or not before passing it to the function
        //Get the current text value, and current user input and pass it to the 
        let formattedAmount = formatAmount(oldAmount: textField.text, userInput: string)
        textField.text = formattedAmount
        return false
    }
    

    Here go my private function to format the number to move from right to left:

    private func formatAmount(currentText: String, userInput: String) -> String {
        let amount = currentText.components(separatedBy: ".")
        var intValue: String = amount[0]
        var decimalValue: String = amount[1]
        
    
        //backspace registered, need to move the number to the right
        if userInput.isEmpty {
            decimalValue.remove(at: decimalValue.index(before: decimalValue.endIndex))
            decimalValue = intValue.last!.string + decimalValue
            intValue.remove(at: intValue.index(before: intValue.endIndex))
            if intValue.isEmpty {
                intValue = "0"
            }
        } else {
            
            //Need to consider if user paste value
            if userInput.count > 2 {
                decimalValue = String(userInput.suffix(2))
                intValue = String(userInput.dropLast(2))
            } else {
                decimalValue = rmAmount[1] + userInput
                
                //Add to int value (move to the right)
                intValue = intValue + decimalValue.first!.string
                
                if Int(intValue) == 0 {
                    intValue = "0"      //00 -> 0
                } else if intValue.first == "0" {
                    //remove 0 from at the first position in intValue
                    intValue.remove(at: intValue.startIndex)    //01 -> 1
                }
                
                //Remove tenth place from decimal value since it goes to Int already
                decimalValue.remove(at: decimalValue.startIndex)
            }
        }
        return intValue + "." + decimalValue
    }
    

    This is basically it. Other extra implementations can be added by your own initiatives. Let me know if there is any problem with my implementation.

    PS: This is of course only works for certain currency only, in my case, my apps is set up only for that local so thats why I use this way.

提交回复
热议问题