Decimal Pad (keyboard type)

swift
xcode
ios

#1

Доброго времени суток друзья.
При проверке приложения на реальном устройстве, возникла проблема с региональными настройками, так как при вводе float значения с российскими региональными настройками на телефоне, вместо точки на всплывающей клавиатуре запятая. И соответственно операция выполняется как с Int, игнорируя введенные данные после запятой. При смене регионального языка ввода на English, точка возвращается на свое место и все операции выполняются правильно.
Не подскажете, где настроить региональные настройки приложения так, чтоб игнорировал пользовательские настройки.


#2

Как вариант вы можете при получении числа менять запятую на точку и работать дальше как с Float


#3

Вот так можно это исправить:

let someNumb = NSNumberFormatter().numberFromString(textField.text)
if let someNumb = someNumb {
    let floatValue = Float(someNumb)
}

Даже, если будет вписано число с запятой, оно будет трансформировано в число без запятой, но с точкой. Например, 1,6 -> 1.6


#4

Спасибо за помощь. После того как заменил перевод текстового значения методом NSString на метод указанный выше, выдала ошибку: Binary operator ‘/’ cannot be applied to two ‘NSNumber?’ operands.

Попробовал как указано ниже, запустился без ошибок и считывает цифры после запятой.

 var someNumb: Float {
        get {
            return NSNumberFormatter().numberFromString(textField.text!)!.floatValue
        }
        set {
            textField.text = "\(newNumb)"
        }
    }

#5

Ну ругается он на то, что Вы где-то с типом путаетесь. И судя по ошибку он вообще что-то деление не одобряет, но я его не вижу.
Попробуйте использовать мой код в чистом виде, перед написанием я его проверил - работал.


#6

Наверное я, что то не туда добавляю или вписываю:

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)
}

}


#7

У Вас ошибка в указанной строке. Замените ее на:

resultLabel.text = String(someNumb + anotherNumb)

Ведь resultLabel.text ожидает получить String, а Вы предлагаете Float.


#8

Такая же ошибка всплывала после добавления 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)")
        }

#9

вот и не знаю как обратиться )))
вы уж простите за не доразумение
у меня ситуация такая

данные настройки записываются в файл
и по извлечении данных из словаря я не могу проконвертировать запятую в точку

//тут достаем данные и вычисляем

    let xxx1 = (NumberFormatter().number(from: (dataArray[0].setProb))?.doubleValue)!

    let xSum = Double(DataProb)! * xxx1  //setProb
    
   resultxSum.text = String(lround(Double(xSum)))

может это сделать при сохранении ??? подскажите плиз как правильно ?
при сохранение чего то тоже не хочет , я склоняюсь что это глюк xcoda 8.3 так как и плей граунде не рабботает


#10
//  расширение для автоматичесткой перевода строки запятой в точку

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
    }
}

Закрыл тему #11