Я рад, что кто-то не боится задать элементарные вопросы.
octopusgrabbus
4
+1 - часть проблемы заключается в том, что документация Clojure иногда не отвечает на эти «базовые» вопросы, которые мы принимаем как должное в других языках. (У меня был тот же вопрос 3 года спустя, и я нашел это).
Glenn
3
@octopusgrabbus - мне было бы интересно узнать, «почему» люди боятся задавать простые вопросы?
appshare.co
1
@Zubair, предполагается, что основные вещи уже где-то объяснены, поэтому вы, скорее всего, что-то упустили, и ваш вопрос будет отклонен из-за отсутствия исследовательских усилий.
Ал.Г.
1
Для тех , кто прибывает сюда из Google ищет , чтобы преобразовать "9"в 9это самое лучшее , что работал для меня (Integer. "9").
weltschmerz
Ответы:
79
Это будет работать на 10pxилиpx10
(defn parse-int [s](Integer. (re-find #"\d+" s )))
он будет анализировать первую непрерывную цифру только так
Хороший ответ! На мой взгляд, это лучше, чем использование строки чтения. Я изменил свой ответ, чтобы использовать вашу технику. Я также внес несколько небольших изменений.
Бенджамин Аткин
это дает мнеException in thread "main" java.lang.ClassNotFoundException: Integer.,
maazza
83
Новый ответ
Мне больше нравится ответ снроботов. В этом простом случае использование метода Java проще и надежнее, чем использование строки чтения. Я сделал пару небольших изменений. Поскольку автор не исключил отрицательные числа, я скорректировал его, чтобы разрешить отрицательные числа. Я также сделал так, чтобы число начиналось с начала строки.
Мне больше всего нравится ваш ответ - жаль, что это не предусмотрено базовой библиотекой clojure. Одна небольшая критика - технически вы ifдолжны быть a, whenпоскольку в ваших fns нет блока else.
quux00
1
Да, пожалуйста, не прекращайте читать после первого или второго фрагмента кода!
Бенджамин Аткин,
2
Хедз-ап на числах с ведущими нулями. read-stringинтерпретирует их как восьмеричные: (read-string "08")выдает исключение. Integer/valueOfобрабатывает их как десятичные: (Integer/valueOf "08")оценивает до 8.
rubasov 05
Также обратите внимание, что read-stringвыдает исключение, если вы указываете ему пустую строку или что-то вроде «29px»
Илья Бояндин
Как это должно. Я ответил на вопрос в заголовке и что люди ожидают, когда увидят эту страницу, прежде чем я ответил на вопрос в теле вопроса. Это последний фрагмент кода в моем ответе.
Спасибо. Это помогло мне разбить продукт на последовательность цифр.
octopusgrabbus
3
Поскольку для этого ответа мы находимся в стране Java, обычно рекомендуется использовать Integer/valueOfконструктор Integer, а не Integer. Класс Integer кэширует значения от -128 до 127, чтобы минимизировать создание объекта. Документ Integer Javadoc описывает это так же, как и этот пост: stackoverflow.com/a/2974852/871012
Будьте осторожны, используя это с пользовательским вводом. read-stringможет выполнять код в соответствии с документами: clojuredocs.org/clojure.core/read-string
jerney
это отлично подходит для надежного ввода, например, для задач программирования. @jerney прав: будьте осторожны, чтобы не использовать его в реальном коде.
hraban
10
AFAIK нет стандартного решения вашей проблемы. Я думаю, что что-то вроде следующего, который использует clojure.contrib.str-utils2/replace, должно помочь:
Не рекомендуется. Он будет работать до тех пор, пока кто-нибудь его не бросит 1.5... и он также не использует встроенную clojure.string/replaceфункцию.
tar
8
Это не идеально, но вот что - то с filter, Character/isDigitи Integer/parseInt. Он не будет работать для чисел с плавающей запятой и не работает, если во входных данных нет цифры, поэтому вам, вероятно, следует очистить его. Я надеюсь, что есть более приятный способ сделать это, не использующий столько Java.
Для всех, кто хочет преобразовать более обычный строковый литерал в число, то есть строку, в которой нет других нечисловых символов. Это два лучших подхода:
В отличие от использования, read-stringиз clojure.coreкоторого небезопасно использовать для ненадежного ввода, edn/read-stringбезопасно запускать для ненадежного ввода, такого как пользовательский ввод.
Это часто более удобно, чем взаимодействие с Java, если вам не нужно иметь особый контроль над типами. Он может анализировать любой числовой литерал, который может анализировать Clojure, например:
Также с помощью (re-seq)функции можно расширить возвращаемое значение до строки, содержащей все числа, существующие во входной строке, в следующем порядке:
Таким образом, из приведенных выше десятичных знаков также следует анализировать.
Возможно, сейчас не совсем отвечаю на вопрос, но для общего использования, я думаю, вы хотели бы быть строгими в отношении того, является ли это число или нет (поэтому «px» не разрешено), и позволить вызывающей стороне обрабатывать не числа, возвращая nil:
Кроме того, просто любопытный вопрос: почему вы используете, (t/refer-tupelo)а не заставляете пользователя делать (:require [tupelo.core :refer :all])?
Qwerp-
refer-tupeloсмоделирован после того refer-clojure, как он не включает в себя все, что (:require [tupelo.core :refer :all])делает способ .
"9"
в9
это самое лучшее , что работал для меня(Integer. "9")
.Ответы:
Это будет работать на
10px
илиpx10
он будет анализировать первую непрерывную цифру только так
источник
Exception in thread "main" java.lang.ClassNotFoundException: Integer.,
Новый ответ
Мне больше нравится ответ снроботов. В этом простом случае использование метода Java проще и надежнее, чем использование строки чтения. Я сделал пару небольших изменений. Поскольку автор не исключил отрицательные числа, я скорректировал его, чтобы разрешить отрицательные числа. Я также сделал так, чтобы число начиналось с начала строки.
Кроме того, я обнаружил, что Integer / parseInt анализирует как десятичное, когда не задано основание, даже если есть ведущие нули.
Старый ответ
Во-первых, чтобы проанализировать только целое число (поскольку это хит в Google и хорошая справочная информация):
Вы можете использовать ридер :
Вы можете проверить, что это номер после прочтения:
Я не уверен, можно ли доверять пользовательскому вводу читателю clojure, чтобы вы могли проверить его перед чтением:
Думаю, я предпочитаю последнее решение.
А теперь к вашему конкретному вопросу. Чтобы проанализировать что-то, что начинается с целого числа, например
29px
:источник
if
должны быть a,when
поскольку в ваших fns нет блока else.read-string
интерпретирует их как восьмеричные:(read-string "08")
выдает исключение.Integer/valueOf
обрабатывает их как десятичные:(Integer/valueOf "08")
оценивает до 8.read-string
выдает исключение, если вы указываете ему пустую строку или что-то вроде «29px»источник
Integer/valueOf
конструктор Integer, а не Integer. Класс Integer кэширует значения от -128 до 127, чтобы минимизировать создание объекта. Документ Integer Javadoc описывает это так же, как и этот пост: stackoverflow.com/a/2974852/871012Для меня это работает в ответе, намного проще.
(строка чтения "123")
=> 123
источник
read-string
может выполнять код в соответствии с документами: clojuredocs.org/clojure.core/read-stringAFAIK нет стандартного решения вашей проблемы. Я думаю, что что-то вроде следующего, который использует
clojure.contrib.str-utils2/replace
, должно помочь:источник
1.5
... и он также не использует встроеннуюclojure.string/replace
функцию.Это не идеально, но вот что - то с
filter
,Character/isDigit
иInteger/parseInt
. Он не будет работать для чисел с плавающей запятой и не работает, если во входных данных нет цифры, поэтому вам, вероятно, следует очистить его. Я надеюсь, что есть более приятный способ сделать это, не использующий столько Java.источник
Я бы, наверное, добавил к требованиям несколько вещей:
Может быть что-то вроде:
а затем, возможно, бонусные баллы за то, чтобы сделать это мульти-методом, который допускает пользовательское значение по умолчанию, отличное от 0.
источник
Расширяя ответ snrobot:
Эта версия возвращает nil, если во входных данных нет цифр, а не вызывает исключение.
У меня вопрос, допустимо ли сокращать имя до «str-> int» или такие вещи всегда должны быть полностью указаны.
источник
Для всех, кто хочет преобразовать более обычный строковый литерал в число, то есть строку, в которой нет других нечисловых символов. Это два лучших подхода:
Использование взаимодействия с Java:
Это позволяет вам точно контролировать тип, в котором вы хотите проанализировать число, когда это важно для вашего варианта использования.
Используя программу чтения Clojure EDN:
В отличие от использования,
read-string
изclojure.core
которого небезопасно использовать для ненадежного ввода,edn/read-string
безопасно запускать для ненадежного ввода, такого как пользовательский ввод.Это часто более удобно, чем взаимодействие с Java, если вам не нужно иметь особый контроль над типами. Он может анализировать любой числовой литерал, который может анализировать Clojure, например:
Полный список здесь: https://www.rubberducking.com/2019/05/clojure-for-non-clojure-programmers.html#numbers
источник
Также с помощью
(re-seq)
функции можно расширить возвращаемое значение до строки, содержащей все числа, существующие во входной строке, в следующем порядке:(defn convert-to-int [s] (->> (re-seq #"\d" s) (apply str) (Integer.)))
(convert-to-int "10not123")
=>10123
(type *1)
=>java.lang.Integer
источник
Вопрос касается разбора строки на число.
Таким образом, из приведенных выше десятичных знаков также следует анализировать.
Возможно, сейчас не совсем отвечаю на вопрос, но для общего использования, я думаю, вы хотели бы быть строгими в отношении того, является ли это число или нет (поэтому «px» не разрешено), и позволить вызывающей стороне обрабатывать не числа, возвращая nil:
И если для вашего домена проблематичны поплавки, а не
Float/parseFloat
поставитьbigdec
или еще что-то.источник
В простых случаях вы можете просто использовать регулярное выражение, чтобы вытащить первую строку цифр, как указано выше.
Если у вас более сложная ситуация, вы можете использовать библиотеку InstaParse:
источник
(t/refer-tupelo)
а не заставляете пользователя делать(:require [tupelo.core :refer :all])
?refer-tupelo
смоделирован после тогоrefer-clojure
, как он не включает в себя все, что(:require [tupelo.core :refer :all])
делает способ .