Clojure, чтобы удалить не числа из строки - PullRequest
5 голосов
/ 18 мая 2011

У меня есть следующий код, чтобы попытаться удалить не числа из строки:

(apply str 
    (flatten 
        (map 
            (fn[x] 
                (if (number? x) x)) 
                "ij443kj"
        )
    )
)

Но он всегда возвращает пустую строку вместо "443". Кто-нибудь знает, что я здесь делаю неправильно и как я могу получить желаемый результат?

Ответы [ 4 ]

17 голосов
/ 18 мая 2011

номер? не работает таким образом. Проверяет тип. Если вы передадите ему персонажа, вы будете каждый раз возвращать ложное значение, независимо от того, что это за персонаж.

Я бы, вероятно, использовал для этого регулярное выражение, но если вы хотите сохранить ту же идею программы, вы можете сделать что-то вроде

(apply str (filter #(#{\0,\1,\2,\3,\4,\5,\6,\7,\8,\9} %) "abc123def"))

или даже лучше

(apply str (filter #(Character/isDigit %) myString))
7 голосов
/ 27 мая 2011

Существует еще более простой способ, используйте регулярное выражение:

(.replaceAll "ij443kj" "[^0-9]" "")
1 голос
/ 16 февраля 2014

получить значения типа char ...

(map int (apply vector "0123456789"))

-> (48 49 50 51 52 53 54 55 56 57)

затем исправьте это:

(defn my-int
[char]
(- (int char) 48))

Теперь давайте попробуем это снова, ладно?

(map my-int (apply vector "0123456789"))

-> (0 1 2 3 4 5 6 7 8 9)

и просто чтобы понять, что они целые числа ...

(map #(* % 10) (map my-int (apply vector "0123456789")))

-> (0 10 20 30 40 50 60 70 80 90)

(reduce + (map my-int (apply vector "0123456789")))

-> 45

0 голосов
/ 14 марта 2017

на случай обработки десятичного числа

#(re-seq #"[0-9\.]+" "ij443kj")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...