“45”와 같은 “45px”와 같은 다양한 문자열이 있습니다. 이 두 가지를 어떻게 숫자 45로 변환합니까?
답변
이 작업 10px
또는px10
(defn parse-int [s]
(Integer. (re-find #"\d+" s )))
첫 번째 연속 숫자 만 구문 분석합니다.
user=> (parse-int "10not123")
10
user=> (parse-int "abc10def11")
10
답변
새로운 답변
나는 snrobot의 대답이 더 좋습니다. Java 메소드를 사용하는 것이이 간단한 사용 사례에 대해 읽기 문자열을 사용하는 것보다 더 간단하고 강력합니다. 몇 가지 작은 변경을했습니다. 저자는 음수를 배제하지 않았으므로 음수를 허용하도록 조정했습니다. 또한 문자열의 시작 부분에서 숫자를 시작해야합니다.
(defn parse-int [s]
(Integer/parseInt (re-find #"\A-?\d+" s)))
또한 선행 0이 있더라도 기수가 주어지지 않으면 Integer / parseInt가 10 진수로 구문 분석된다는 것을 알았습니다.
이전 답변
먼저 정수를 구문 분석하려면 (Google에서 히트하고 좋은 배경 정보이므로)
당신은 독자를 사용할 수 있습니다 :
(read-string "9") ; => 9
읽은 후 숫자인지 확인할 수 있습니다.
(defn str->int [str] (if (number? (read-string str))))
clojure 리더가 사용자 입력을 신뢰할 수 있는지 잘 모르겠으므로 읽기 전에 확인할 수도 있습니다.
(defn str->int [str] (if (re-matches (re-pattern "\\d+") str) (read-string str)))
나는 마지막 해결책을 선호한다고 생각합니다.
그리고 지금, 당신의 특정 질문에. 정수, 등으로 시작 뭔가를 구문 분석하려면 29px
:
(read-string (second (re-matches (re-pattern "(\\d+).*") "29px"))) ; => 29
답변
(defn parse-int [s]
(Integer. (re-find #"[0-9]*" s)))
user> (parse-int "10px")
10
user> (parse-int "10")
10
답변
이것은 훨씬 더 직설적으로 나를 위해 작동합니다.
(읽기 문자열 “123”)
=> 123
답변
AFAIK 문제에 대한 표준 솔루션이 없습니다. 을 사용하는 다음과 같은 clojure.contrib.str-utils2/replace
것이 도움이 될 것이라고 생각합니다 .
(defn str2int [txt]
(Integer/parseInt (replace txt #"[a-zA-Z]" "")))
답변
완벽하지는 않지만 여기에 뭔가가 있습니다. filter
, Character/isDigit
하고 Integer/parseInt
. 부동 소수점 숫자에서는 작동하지 않으며 입력에 숫자가 없으면 실패하므로 정리해야합니다. Java를 많이 포함하지 않는 더 좋은 방법이 있기를 바랍니다.
user=> (defn strToInt [x] (Integer/parseInt (apply str (filter #(Character/isDigit %) x))))
#'user/strToInt
user=> (strToInt "45px")
45
user=> (strToInt "45")
45
user=> (strToInt "a")
java.lang.NumberFormatException: For input string: "" (NO_SOURCE_FILE:0)
답변
아마도 요구 사항에 몇 가지 사항을 추가 할 것입니다.
- 숫자로 시작해야합니다
- 빈 입력을 견뎌야 함
- 모든 객체가 전달되는 것을 허용합니다 (toString이 표준 임).
어쩌면 다음과 같은 것 :
(defn parse-int [v]
(try
(Integer/parseInt (re-find #"^\d+" (.toString v)))
(catch NumberFormatException e 0)))
(parse-int "lkjhasd")
; => 0
(parse-int (java.awt.Color. 4 5 6))
; => 0
(parse-int "a5v")
; => 0
(parse-int "50px")
; => 50
그런 다음이 방법을 다중 방법으로 만들면 보너스 포인트가 아닌 사용자 제공 기본값을 사용할 수 있습니다.
