Ios swift 3.1无法从UITextField传递小数

Ios swift 3.1无法从UITextField传递小数,ios,uitextfield,double,Ios,Uitextfield,Double,在我的视图控制器中,我有一个uitextfield,用户可以通过按add按钮输入一些费用的小数。 问题是:如果我输入Int,比如“100”,一切都正常,但是如果我输入“12,3”,即使我将文本转换为双精度格式,也不接受数据 注意:如果我输入一个小数,“打印1”值并停止,就像没有设置数据一样 注2:在我的textfield中,由于xcodebug关于textfield键盘的问题,我将其设置为“无更正和拼写检查”,但此更改似乎不会影响当前问题 我宣布: var amount : Double! 我

在我的视图控制器中,我有一个uitextfield,用户可以通过按add按钮输入一些费用的小数。 问题是:如果我输入Int,比如“100”,一切都正常,但是如果我输入“12,3”,即使我将文本转换为双精度格式,也不接受数据 注意:如果我输入一个小数,“打印1”值并停止,就像没有设置数据一样 注2:在我的textfield中,由于xcodebug关于textfield键盘的问题,我将其设置为“无更正和拼写检查”,但此更改似乎不会影响当前问题

我宣布:

var amount : Double!
我的按钮:

@IBAction func addBillButton(_ sender: UIButton) {

    print("button pressed 1")

    guard self.dataInput.text != nil else {return}
    amount = Double(self.dataInput.text!)
    guard amount != nil else {return}
    print("amount       : \(amount!)")


    dateShowed = myDatePicker.date as NSDate!
    let dateShowedString = convertDateToString(dateToConvert: dateShowed as NSDate)
    print("date         : \(dateShowedString)")


    if presentPickName != nil {
        print("name is  : \(presentPickName!)")
    } else {
        print("presentPickName is nil")
    }


    //        guard presentPickData != nil else {return}
    if presentPickTag != nil {
        print("tag is       : \(presentPickTag!)")
    } else {
        print("presentPickData is nil")
    }

    //func for saving in core data
//        saveExpense(amountToSave: amount, amountDate: dateShowed as NSDate, owner: presentPickName, tag: presentPickTag)

    resetViewForNextInput()

    self.dataInput.resignFirstResponder()


    print("button pressed 2")

 }
故事板中的文本字段

编辑解决方案:

在我的按钮里

    guard let stringFromTxtField = self.dataInput.text else {return}
    print(stringFromTxtField)
    let myFormatter = NumberFormatter().number(from: stringFromTxtField) as! Double
    print(myFormatter)
    amount = myFormatter

它取决于语言环境,直接从文本传递到数字,反之亦然,应始终使用
NumberFormatter
完成。数字格式化程序知道设置中设置的区域设置,并正确转换您的数字。
例如,在意大利,小数位数显示为
,意大利用户很自然地会输入1,5或54,2这样的数字,swift
Double
会打印1.5 54.2这样的小数,因为编程语言要求数字采用美国格式。
因此,
Double
无法解析字符串,因为它需要此格式的数字。
使用
NumberFormatter
可以从文本传递到正确的数字,因为它从区域设置中知道意大利的十进制分隔符是

当然,数字格式化程序有很多选项,强制使用区域设置,强制使用十进制分隔符等等

let double = NumberFormatter().number(from: "1,3") as! Double

这行代码的语言环境设置为意大利,将得到正确的数字1.3

非常好的解释!但我应该如何在我的代码中实现它?@biggreentree使用数字格式,因为我不是专家,我在我的更新中添加了一个可能的解决方案,你能检查一下我是否错了吗?现在它应该可以工作了,如果你能给我一些优化它的建议,那就太好了,谢谢你solution@biggreentree没有优化,,现在应该没问题了,如果你想完全安全,最好将汽车作为一个可选的,并打开值。像这样:
guard let double=NumberFormatter().number(from:“1,3”)as?Double-else{return}金额=Double
。删除你的守卫声明。如果浇铸正确,则将浇铸量设置为double值。如果不是的话,它只是返回