Scala: проверка строки только на наличие цифр, ведущих себя странно

#string #scala

#строка #скала

Вопрос:

Я написал код, который работает, как и ожидалось, когда я подаю заявку на ввод не пустой строки только с цифрами или не только с цифрами:

    def checkDigits(nameOrId: String): Unit = {

      def isAllDigits(x: String) = x forall (c => c.isDigit)

      if (isAllDigits(nameOrId)) print("WITH_ID ")
      else print("WITH_NAME")
  }
 

Но когда я подаю заявку на ввод «»-value, он выводит не «WITH_NAME», а «WITH_ID». Таким образом, он распознает «» как цифру-символ!

Что я делаю не так и как я мог бы улучшить свой код?

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

1. Boolean):Boolean» rel=»nofollow noreferrer»> Со страницы ScalaDocs: forall() возвращает true , если эта строка пуста или данный предикат p выполняется для всех символов этой строки… Вместо этого вы можете попробовать регулярное выражение: nameOrId matches "\d "

Ответ №1:

forall Метод проверяет, является ли тест истинным для всех значений в коллекции. Если значений нет, он возвращается true , потому что все значения проходят проверку.

Для нужного вам поведения вам нужно добавить дополнительный тест:

 def isAllDigits(x: String) = x.nonEmpty amp;amp; x.forall(_.isDigit)
 

Ответ №2:

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

Обратите внимание, что ваш метод def checkDigits возвращает единицу измерения, потому что вы только печатаете. Чтобы заставить ее возвращать логическое значение, вы можете использовать:

 def checkDigits(x: String) = x.matches("\d ")