7

私はしばらくの間、これが私たちのものであることを理解しようとしてきました。

(defn is-decimal [astr]
  (if (. astr (indexOf (int \.)))
    (Double/parseDouble astr)
    (Integer/parseInt astr)))

それが私が書いた関数です。is-decimalには "2.5" や "5" などの何かが渡されますが、常にifの 2 番目の引数が使用され、3 番目の引数は使用されません。REPL でテスト(. astr (indexOf (int \.)))したところ、問題なく動作しているようです。失敗すると -1 が返され、失敗すると 1 が返されます。それが問題かもしれないと思います。-1 は、Clojure では false を意味しません。誰でもこれを修正する方法を考えることができますか?

前もって感謝します。

編集:助けてくれてありがとう。これを書いた直後に、ある考えが浮かびました。1 と -1 をチェックする述語関数を作成しました。必要なものだけ。目覚めた直後にコーディングするべきではありません:\

4

3 に答える 3

10

文字列に文字が含まれているかどうかをテストする場合は、正規表現を使用できます。

(re-find #"\." astr)

または:

(some #(= \. %) astr)

または:

(contains? (into #{} astr) \.)

または、これも行うclojure.contrib.seq-utilsincludes?から使用できます。

Clojure には int と double を区別する方法を知っているリーダーが既にあるので、文字列に数値しか含まれていないことが確実な場合は、それを使用できます。(ただし、これは数字だけでなく、何でも読み取ることに注意してください。これは潜在的に危険です。文字列に数字以外のものが含まれる可能性がある場合は、これを使用しないでください。)

Clojure は、整数が大きすぎてintオーバーフローせずにネイティブに収まらない場合も処理することに注意してください。整数を解析したい場合は、parseInt.

user> (class (read-string "2.5"))
java.lang.Double
user> (class (read-string "2"))
java.lang.Integer
user> (class (read-string "2000000000000"))
java.math.BigInteger

関数が述語の場合、Clojureでは .decimal?ではなく名前を付けるのが一般的ですis-decimalparse-numberあなたの関数は実際には数値パーサーに近いので、個人的にはorと呼びますstring-to-number

于 2009-02-06T19:16:16.437 に答える
6

未テスト:

(if (> 0 (. astr (indexOf (int \.))))
于 2009-02-05T14:26:40.343 に答える
2

失敗した場合は-1を返し、失敗した場合は-1をチェックし、失敗した場合はfalseを返します

于 2009-02-05T14:25:30.127 に答える