Десятичное число в текстовом поле

#ios #swift

#iOS #swift

Вопрос:

Я пытаюсь получить десятичное число из текстового поля. Это может быть только десятичное число, но если я введу что-то вроде ‘o, 5’, то маркеры будут появляться намного быстрее, чем каждые 0,5 секунды.

Мой код:

 @IBAction func enemyBulletDelayClick(_ sender: AnyObject) {
    dismissKeyboard()

    let correctNumber = enemyBulletDelayText.text?.replacingOccurrences(of: ",", with: ".")
    enemyBulletDelay = Double(correctNumber!)!
    enemyBulletDelayText.text = ""
}
  

(Я преобразую каждое ‘,’ в ‘.’ для десятичных чисел.)
В противном случае это выдало бы мне ошибку.

Комментарии:

1. Правильный способ преобразовать введенное пользователем десятичное число в NSNumber (затем Double ) — использовать NSNumberFormatter / NumberFormatter .

2. И избегайте всего этого ! . Они ожидают сбоев, которые должны произойти.

Ответ №1:

Я попытался использовать этот код, и это сработало!

Код:

 let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal

enemySpawnDelay = (formatter.number(from: enemySpawnDelayText.text!)?.doubleValue)!
  

Ответ №2:

Если у вас есть? вам нужно развернуть, а не поместить!

Существует множество способов удаления . впоследствии. Выбирайте все, что хотите. Это больше ориентировано на процесс того, что вы делаете, а затем вы можете решить использовать NSNumberFormatter или что вы хотите сделать.

 guard let enemyBulletDelayString = enemyBulletDelayText.text? else {
    //put whatever you want to do here if this check doesn't pass
    return
}

let numberFormatter = NumberFormatter()
formatter.numberStyle = numberFormatter.Style.decimal

if let formattedNumber = numberFormatter.number(from: enemyBulletDelayString) {
  enemySpawnDelay = formattedNumber.doubleValue
} else {
  numberFormatter.decimalSeparator = ","
  if let formattedNumber = numberFormatter.number(from: enemyBulletDelayString) {
  enemySpawnDelay = formattedNumber.doubleValue
  }
}
  

Это должно работать с тем, что вы хотите сделать.

Комментарии:

1. Вероятно, нет особых причин использовать оба десятичных разделителя. Пользователь в данной локали будет вводить числа только в их обычном формате. И это поможет, если используется десятичная клавиатура, которая будет отображать только правильный разделитель.

2. Спасибо за помощь, но если я использую это, оно всегда будет выдавать 0.0 вместо числа в текстовом поле.

3. удалите мою переменную var enemyBulletDelay в, я просто поместил ее туда в качестве примера. Похоже, у вас уже есть переменная enemySpawnDelay, поэтому установите для нее значение formattedNumber.doubleValue .

4. Я отредактировал свой код, чтобы задать вашу переменную…. Я видел ваш код выше, который, по вашим словам, работал. Помните о инструкции guard, которую я добавил, чтобы развернуть «enemySpawnDelayText.text» на случай возникновения каких-либо сбоев при доступе к этому тексту. У вас их никогда не должно быть! где угодно (есть менее распространенные случаи, в которых вы определенно можете их использовать, но не делайте этого, пока не поймете их). Вы должны развернуть что-нибудь с помощью ?.