Как ограничить десятичное значение ввода в UITextField - PullRequest
0 голосов
/ 26 января 2019

В настоящее время я проверяю свой UITextField, который настроен на отображение числовой клавиатуры в shouldChangeCharactersIn, чтобы ограничить ввод только одним десятичным разделителем и только двумя десятичными точками, как это (спасибо этот вопрос ):

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

    let decimalSeparator = String(Locale.current.decimalSeparator ?? ".")

    if (textField.text?.contains(decimalSeparator))! {

        let limitDecimalPlace = 2
        let decimalPlace = textField.text?.components(separatedBy: decimalSeparator).last

        if (decimalPlace?.count)! < limitDecimalPlace {

            return true

        } else {

           return false

        }

    }

}

Это прекрасно работает.Однако теперь можно вставлять любое значение, которое хочет пользователь, и которое я хочу ограничить значением меньше 999. Я использовал, чтобы проверить длину, чтобы разрешить только 3 символа, но теперь я хочу разрешить следующие значения (например):

143
542.25
283.02
19.22
847.25

Но я не хочу разрешать:

2222
3841.11
999.99

Как я могу это сделать?

1 Ответ

0 голосов
/ 26 января 2019

Вам, вероятно, понадобятся две проверки:

  1. Убедитесь, что в форме xxx.xx.Такой вид сопоставления с образцом часто достигается с помощью поиска по регулярному выражению.

    Хитрость здесь в том, чтобы убедиться, что вы поддерживаете все перестановки с десятичным знаком и без него, где дробные цифры составляют две или менее цифры, а целые цифрысостоит из трех или менее цифр.

  2. Попробуйте преобразовать его в число и убедитесь, что значение меньше 999.

Таким образом:

let formatter = NumberFormatter()

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let candidate = ((textField.text ?? "") as NSString).replacingCharacters(in: range, with: string)
    let separator = formatter.decimalSeparator!

    if candidate == "" { return true }

    let isWellFormatted = candidate.range(of: "^[0-9]{1,3}([\(separator)][0-9]{0,2})?$", options: .regularExpression) != nil

    if isWellFormatted,
        let value = formatter.number(from: candidate)?.doubleValue,
        value >= 0,
        value < 999 {
            return true
    }

    return false
}

Примечание:

  • Я предполагаю, что вы хотите, чтобы пользователи могли соблюдать настройки локализации своего устройства (например, позволить немецкому пользователю ввести 123,45, потому что они используют, в качестве десятичного разделителя).

  • Регулярное выражение "^[0-9]{1,3}([\(separator)][0-9]{0,2})?$”, вероятно, выглядит немного неопрятно, если вы не привыкли к регулярным выражениям.

    • ^ соответствует началу строки;
    • [0-9] явно соответствует любой цифре;
    • {1,3} соответствует от одного до трехцелые цифры;
    • (...)? говорит «при желании, ищите следующее»;
    • Опять же, [0-9]{0,2} означает «от нуля до двух дробных цифр;и
    • $ соответствует концу строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...