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