【问题标题】:Clojure to remove non-numbers from a stringClojure 从字符串中删除非数字
【发布时间】:2011-05-18 14:23:46
【问题描述】:

我有以下代码尝试从字符串中删除非数字:

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

但它总是返回一个空字符串而不是“443”。有谁知道我在这里做错了什么以及如何获得预期的结果?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    号码?不能那样工作。它检查类型。如果你传给它一个字符,你每次都会返回 false,不管这个字符是什么。

    我可能会为此使用正则表达式,但如果您想保持程序的相同想法,您可以执行类似的操作

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

    甚至更好

    (apply str (filter #(Character/isDigit %) myString))
    

    【讨论】:

    • 是的,你是对的。我同意这个数字?不能那样工作。我应该改用哪个函数?
    • 请注意,您不需要将 set 包装在函数中。设置实现 IFn 以便您可以编写 (filter #{\1\2\3} "abc123def")
    • 这对我也很有效:我刚刚遇到了 Doubles 的问题,所以我将其更改为:(filter #(#{\0,\1,\2,\3,\ 4,\5,\6,\7,\8,\9,\.} %) my-double-number) 谢谢!
    【解决方案2】:

    还有一种更简单的方法,使用正则表达式:

    (.replaceAll "ij443kj" "[^0-9]" "")
    

    【讨论】:

      【解决方案3】:

      获取 char 的 int 值...

      (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

      【讨论】:

        【解决方案4】:

        如果你要处理小数

        #(re-seq #"[0-9\.]+" "ij443kj")
        

        【讨论】:

          猜你喜欢
          • 2013-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多