Ios 文本格式文本字段swift

Ios 文本格式文本字段swift,ios,swift,Ios,Swift,我正在尝试格式化文本字段。它应该包含数字,并且必须始终以“00”结尾。如果用户输入10,则文本应始终以10.00结尾。我试过了,但没有得到他想要的结果: func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let numberFormatter = NSNumberFormatt

我正在尝试格式化文本字段。它应该包含数字,并且必须始终以“00”结尾。如果用户输入10,则文本应始终以10.00结尾。我试过了,但没有得到他想要的结果:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let numberFormatter = NSNumberFormatter()
    numberFormatter.numberStyle = .DecimalStyle
    numberFormatter.minimumFractionDigits = 2
    numberFormatter.maximumFractionDigits = 2

    let textValue = Double(textField.text!)
    textField.text = numberFormatter.stringFromNumber(textValue!)

    return true
}

现在是空白了

建议将文本转换为实际数字,并使用
NSNumberFormatter
设置
最小分数位数
最大分数位数
。例如:

let numberFormatter = NSNumberFormatter()
numberFormatter.locale = NSLocale.currentLocale()
numberFormatter.numberStyle = .DecimalStyle
numberFormatter.minimumFractionDigits = 2
numberFormatter.maximumFractionDigits = 2
textField.text = numberFormatter.stringFromNumber(#your number#)

建议将文本转换为实际数字,并使用
NSNumberFormatter
设置
minimumFractionDigits
maximumFractionDigits
。例如:

let numberFormatter = NSNumberFormatter()
numberFormatter.locale = NSLocale.currentLocale()
numberFormatter.numberStyle = .DecimalStyle
numberFormatter.minimumFractionDigits = 2
numberFormatter.maximumFractionDigits = 2
textField.text = numberFormatter.stringFromNumber(#your number#)

从您提供的代码开始,编译器给出了它崩溃的原因:“致命错误:在展开可选值时意外发现nil。”
textValue
nil
,因为当引入第一个字符时,
textField
是空的,从空字符串中获得一个
双精度
的结果是
nil

还要注意的是,即使一切正常,您也应该返回
false
,以便在
textField
中进行更改

关于解决方案,我不确定是否理解您的问题,因此我在这里提出两种解决方案:

S1:您希望更改文本字段,因此它总是以##.00格式显示一个数字,其中#是任意数字。 用户输入1并显示1.00。 注意,这样就不可能有这样的东西:10.50或2.35

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

    var originalString =  textField.text!
    var replacedString: String!

    // Deleting text
    if string.isEmpty {
        // Delete the first caracter before .00
        let loc = originalString.characters.count - 4
        let range = NSMakeRange(loc, 1)
        replacedString = (originalString as NSString).stringByReplacingCharactersInRange(range, withString: "")

        if replacedString == ".00" {
            textField.text = ""
            return false
        }

        replacedString = formatNumberFromString(replacedString)
        textField.text = replacedString
        return false
    }


    if originalString.isEmpty {
        // If we want to avoid having zeros before the dot. Ex.: 000.00
        if string == "0" {
            return false
        }
        replacedString = string + ".00"
        textField.text = replacedString
        return false
    } else {
        // Original string has the format ###.00
        originalString = originalString.stringByReplacingOccurrencesOfString(".00", withString: "")
        replacedString = originalString + string + ".00"

        // Format number
        replacedString = formatNumberFromString(replacedString)
        textField.text = replacedString
        return false
    }

    // For any other UITextField's
    return true
}

func formatNumberFromString(var stringNumber: String) -> String {
    if stringNumber.isEmpty {
        return ""
    }

    // Replace any formatting commas
    stringNumber = stringNumber.stringByReplacingOccurrencesOfString(",", withString: "")

    let doubleFromString = Double(stringNumber)

    let finalString = numberFormatter.stringFromNumber(doubleFromString!)
    return finalString!
}
S2:您想更改文本字段,因此它总是有两位小数。 如果用户输入1,则显示0.01。接下来是3,它显示0.13、7->1.37等等

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

    var originalString = textField.text

    // Replace any formatting commas
    originalString = originalString!.stringByReplacingOccurrencesOfString(",", withString: "")

    var doubleFromString:  Double!

    if originalString!.isEmpty {
        originalString = string
        doubleFromString = Double(originalString!)
        doubleFromString! /= 100
    } else {
        if string.isEmpty {
            // Replace the last character for 0
            let loc = originalString!.characters.count - 1
            let range = NSMakeRange(loc, 1)
            let newString = (originalString! as NSString).stringByReplacingCharactersInRange(range, withString: "0")
            doubleFromString = Double(newString)
            doubleFromString! /= 10
        } else {
            originalString = originalString! + string
            doubleFromString = Double(originalString!)
            doubleFromString! *= 10
        }

    }

    let finalString = numberFormatter.stringFromNumber(doubleFromString)

    textField.text = finalString

    return false
}
还请注意,我将
NSNumberFormatter
初始值设定项移到这些函数之外,因为这是一个耗时的操作

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!

    let numberFormatter = NSNumberFormatter()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.textField.delegate = self

        numberFormatter.numberStyle = .DecimalStyle
        numberFormatter.minimumFractionDigits = 2
        numberFormatter.maximumFractionDigits = 2
    }

    // ...
}

我希望这有助于解决您的问题。

从您提供的代码开始,编译器给出了它崩溃的原因:“致命错误:在展开可选值时意外发现nil。”
textValue
nil
,因为当引入第一个字符时,
textField
是空的,从空字符串中获得一个
双精度
的结果是
nil

还要注意的是,即使一切正常,您也应该返回
false
,以便在
textField
中进行更改

关于解决方案,我不确定是否理解您的问题,因此我在这里提出两种解决方案:

S1:您希望更改文本字段,因此它总是以##.00格式显示一个数字,其中#是任意数字。 用户输入1并显示1.00。 注意,这样就不可能有这样的东西:10.50或2.35

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

    var originalString =  textField.text!
    var replacedString: String!

    // Deleting text
    if string.isEmpty {
        // Delete the first caracter before .00
        let loc = originalString.characters.count - 4
        let range = NSMakeRange(loc, 1)
        replacedString = (originalString as NSString).stringByReplacingCharactersInRange(range, withString: "")

        if replacedString == ".00" {
            textField.text = ""
            return false
        }

        replacedString = formatNumberFromString(replacedString)
        textField.text = replacedString
        return false
    }


    if originalString.isEmpty {
        // If we want to avoid having zeros before the dot. Ex.: 000.00
        if string == "0" {
            return false
        }
        replacedString = string + ".00"
        textField.text = replacedString
        return false
    } else {
        // Original string has the format ###.00
        originalString = originalString.stringByReplacingOccurrencesOfString(".00", withString: "")
        replacedString = originalString + string + ".00"

        // Format number
        replacedString = formatNumberFromString(replacedString)
        textField.text = replacedString
        return false
    }

    // For any other UITextField's
    return true
}

func formatNumberFromString(var stringNumber: String) -> String {
    if stringNumber.isEmpty {
        return ""
    }

    // Replace any formatting commas
    stringNumber = stringNumber.stringByReplacingOccurrencesOfString(",", withString: "")

    let doubleFromString = Double(stringNumber)

    let finalString = numberFormatter.stringFromNumber(doubleFromString!)
    return finalString!
}
S2:您想更改文本字段,因此它总是有两位小数。 如果用户输入1,则显示0.01。接下来是3,它显示0.13、7->1.37等等

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

    var originalString = textField.text

    // Replace any formatting commas
    originalString = originalString!.stringByReplacingOccurrencesOfString(",", withString: "")

    var doubleFromString:  Double!

    if originalString!.isEmpty {
        originalString = string
        doubleFromString = Double(originalString!)
        doubleFromString! /= 100
    } else {
        if string.isEmpty {
            // Replace the last character for 0
            let loc = originalString!.characters.count - 1
            let range = NSMakeRange(loc, 1)
            let newString = (originalString! as NSString).stringByReplacingCharactersInRange(range, withString: "0")
            doubleFromString = Double(newString)
            doubleFromString! /= 10
        } else {
            originalString = originalString! + string
            doubleFromString = Double(originalString!)
            doubleFromString! *= 10
        }

    }

    let finalString = numberFormatter.stringFromNumber(doubleFromString)

    textField.text = finalString

    return false
}
还请注意,我将
NSNumberFormatter
初始值设定项移到这些函数之外,因为这是一个耗时的操作

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!

    let numberFormatter = NSNumberFormatter()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.textField.delegate = self

        numberFormatter.numberStyle = .DecimalStyle
        numberFormatter.minimumFractionDigits = 2
        numberFormatter.maximumFractionDigits = 2
    }

    // ...
}

我希望这有助于解决您的问题。

已经尝试过了,但在这种情况下并不正确。我使用shouldChangeCharactersInRange来格式化文本,但在这里它会中断让textValue=Double(textField.text!)textField.text=numberFormatter.stringFromNumber(textValue!)@brenomaris您可能应该编辑您的问题并显示您得到的结果(例如它是如何中断的)已经尝试过了,但在这种情况下不是正确的。我正在使用shouldChangeCharactersInRange格式化文本,但在这里它会中断让textValue=Double(textField.text!)textField.text=numberFormatter.stringFromNumber(textValue!)@brenomaris您可能应该编辑您的问题并显示您得到的结果(例如它是如何中断的)使用
numberFormatter.numberFromString
将文本转换为数字,而不是使用
Double()
强制转换。还请提供崩溃时提供的错误。@spassas现在的文本为“nil”,请使用
numberFormatter.numberFromString
将文本转换为数字,而不是
Double()
强制转换。还请提供崩溃时提供的错误。@spassas现在在文本中为“nil”