#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 ")