Доброго времени суток друзья.
При проверке приложения на реальном устройстве, возникла проблема с региональными настройками, так как при вводе float значения с российскими региональными настройками на телефоне, вместо точки на всплывающей клавиатуре запятая. И соответственно операция выполняется как с Int, игнорируя введенные данные после запятой. При смене регионального языка ввода на English, точка возвращается на свое место и все операции выполняются правильно.
Не подскажете, где настроить региональные настройки приложения так, чтоб игнорировал пользовательские настройки.
Decimal Pad (keyboard type)
Как вариант вы можете при получении числа менять запятую на точку и работать дальше как с Float
Вот так можно это исправить:
let someNumb = NSNumberFormatter().numberFromString(textField.text)
if let someNumb = someNumb {
let floatValue = Float(someNumb)
}
Даже, если будет вписано число с запятой, оно будет трансформировано в число без запятой, но с точкой. Например, 1,6 -> 1.6
Спасибо за помощь. После того как заменил перевод текстового значения методом NSString на метод указанный выше, выдала ошибку: Binary operator ‘/’ cannot be applied to two ‘NSNumber?’ operands.
Попробовал как указано ниже, запустился без ошибок и считывает цифры после запятой.
var someNumb: Float {
get {
return NSNumberFormatter().numberFromString(textField.text!)!.floatValue
}
set {
textField.text = "\(newNumb)"
}
}
Ну ругается он на то, что Вы где-то с типом путаетесь. И судя по ошибку он вообще что-то деление не одобряет, но я его не вижу.
Попробуйте использовать мой код в чистом виде, перед написанием я его проверил - работал.
Наверное я, что то не туда добавляю или вписываю:
import UIKit
class ViewController: UIViewController {
@IBOutlet var firstOperand: UITextField!
@IBOutlet var secondOperand: UITextField!
@IBOutlet var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// 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.
}
@IBAction func calculateButton(sender: AnyObject) {
let someNumb = NSNumberFormatter().numberFromString(firstOperand.text!)
if let someNumb = someNumb {
let floatValue = Float(someNumb)
}
let anotherNumb = NSNumberFormatter().numberFromString(secondOperand.text!)
if let anotherNumb = anotherNumb {
let floatValue = Float(anotherNumb)
}
resultLabel.text = (someNumb + anotherNumb)
}
}
У Вас ошибка в указанной строке. Замените ее на:
resultLabel.text = String(someNumb + anotherNumb)
Ведь resultLabel.text ожидает получить String, а Вы предлагаете Float.
Такая же ошибка всплывала после добавления String. Решил методом, как указано ниже:
@IBAction func calculateButton(sender: AnyObject) {
if firstOperand.text!.isEmpty || secondOperand.text!.isEmpty {
resultLabel.text = "0.00"
}
else {
let someNumb = NSNumberFormatter().numberFromString(firstOperand.text!)!.floatValue
let anotherNumb = NSNumberFormatter().numberFromString(secondOperand.text!)!.floatValue
let calculation = someNumb+anotherNumb
resultLabel.text = ("\(calculation)")
}
вот и не знаю как обратиться )))
вы уж простите за не доразумение
у меня ситуация такая
данные настройки записываются в файл
и по извлечении данных из словаря я не могу проконвертировать запятую в точку
//тут достаем данные и вычисляем
let xxx1 = (NumberFormatter().number(from: (dataArray[0].setProb))?.doubleValue)!
let xSum = Double(DataProb)! * xxx1 //setProb
resultxSum.text = String(lround(Double(xSum)))
может это сделать при сохранении ??? подскажите плиз как правильно ?
при сохранение чего то тоже не хочет , я склоняюсь что это глюк xcoda 8.3 так как и плей граунде не рабботает
// расширение для автоматичесткой перевода строки запятой в точку
extension String {
static let numberFormatter = NumberFormatter()
var doubleValue: Double {
String.numberFormatter.decimalSeparator = "."
if let result = String.numberFormatter.number(from: self) {
return result.doubleValue
} else {
String.numberFormatter.decimalSeparator = ","
if let result = String.numberFormatter.number(from: self) {
return result.doubleValue
}
}
return 0
}
}