用户在UITextField中键入数字时如何添加分组分隔符?

时间:2018-01-25 14:42:52

标签: swift

我正在使用货币类型UITextField。我需要的行为是这样的:

enter image description here

我设法创建了小数部分。但是我在成千上万的分组器中添加问题时遇到了问题。如何在此处对整数部分进行分组?

以下是目前的代码:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!

    let DIGITS = ["0","1","2","3","4","5","6","7","8","9","0"]
    let DECIMAL_SEPERATOR = ","
    let THOUSAND_SEPERATOR = "."
    let DECIMAL_DIGITS = 2
    let DECIMAL_DIGITS_DEFAULT_STRING = "00"

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
        textField.text = "0\(DECIMAL_SEPERATOR)\(DECIMAL_DIGITS_DEFAULT_STRING)"
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //Textfield
    func textFieldTriggerDone(){

        if !textField.text!.containsString(DECIMAL_SEPERATOR){
            textField.text = textField.text! + DECIMAL_SEPERATOR + DECIMAL_DIGITS_DEFAULT_STRING
        }

        print("Add missing parts here")
    }

    func textFieldTriggerDecimalTyped(){
        textField.text = textField.text! + DECIMAL_SEPERATOR
    }

    func textFieldShouldAddNumber(text: String, range: NSRange, replacement: String, dots: Int) -> Bool{

        let nsstring = NSString(string: text)
        let decimalRange = nsstring.rangeOfString(DECIMAL_SEPERATOR)

        if range.location > decimalRange.location{

            let parts = text.componentsSeparatedByString(DECIMAL_SEPERATOR)
            if parts.count > 1{
                if parts[1].characters.count > (DECIMAL_DIGITS-1){
                    return false
                }
            }

        }else if range.location < decimalRange.location{

            if textField.text!.characters.count == 1 && textField.text! == "0"{
                textField.text = replacement
                return false
            }else{
                let insertIndex = text.startIndex.advancedBy(range.location-dots)
                var finalText = text

                if replacement.characters.count > 0 {
                    finalText.insert(replacement.characters.first!, atIndex: insertIndex)
                    textField.text = finalText
                    let begin = textField.beginningOfDocument
                    let pos = textField.positionFromPosition(begin, offset: (range.location+1))
                    let cursorpos = textField.textRangeFromPosition(pos!, toPosition: pos!)
                    textField.selectedTextRange = cursorpos
                    //textFieldAddThousandSeperators()
                    return false
                }
            }

        }

        return true
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

    func textFieldDidEndEditing(textField: UITextField) {
        textFieldTriggerDone()
    }

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

        let dots = textField.text!.occurancesOf(THOUSAND_SEPERATOR)


        if string == ""{
            if textField.text!.characters.count > 1{
                return true
            }else{
                textField.text! = "0"
                return false
            }
        }

        if range.location == 0 && string == "0"{
            return false
        }

        if DIGITS.contains(string){
            return textFieldShouldAddNumber(textField.text!, range: range, replacement: string, dots: dots)
        }

        if string == DECIMAL_SEPERATOR || string == THOUSAND_SEPERATOR{

            if textField.text!.containsString(DECIMAL_SEPERATOR){
                return false
            }

            textFieldTriggerDecimalTyped()
            return false
        }

        return false
    }

}

1 个答案:

答案 0 :(得分:0)

看看这个答案: https://stackoverflow.com/a/40469426/6863743

代码:

5.0.1.BUIDL-SNAPSHOT

要让它转换回你可以进行计算的东西,你可以写一个函数来取出&#34;,&#34;和&#34;。&#34;等等。

希望这有点帮助,这是我找到的货币格式化的最佳解决方案。