16

10進数の文字列を10進数に変換し、10進数を文字列に変換する関数を作成するにはどうすればよいですか?

4

4 に答える 4

38

何かを文字列に変換したり、数値に似たものを BigDecimal に変換したりするための非常に便利な clojure 関数があります。

user=> (bigdec "1234")
1234M
user=> (str 1234M)
"1234"

これはclojureの標準的な方法だと思います。

于 2012-05-25T15:13:03.713 に答える
4

この例では、数値文字列を数値に変換します。

(defn String->Number [str]
  (let [n (read-string str)]
       (if (number? n) n nil)))

サンプル:

user=> (String->Number "4.5")
4.5
user=> (str 4.5)
"4.5"
user=> (String->Number "abc")
nil
于 2012-05-25T10:50:00.830 に答える
2

read-string小数ではなく、浮動小数点数が得られることに注意してください。

user=> (.getClass (read-string "1.01"))
java.lang.Double

あなたが望むもののように返された数は印刷されますが、正確にはそうではありません。

user=> (new BigDecimal (read-string "1.01"))
1.0100000000000000088817841970012523233890533447265625M

代わりに使用java.math.BigDecimalして、浮動小数点の複雑さを回避できます。

user=> (new BigDecimal "1.01")
1.01M
user=> (.toString (new BigDecimal "1.01"))
"1.01"
于 2012-05-25T13:28:47.600 に答える
1

あなたの質問から、トグル関数が必要なようです。これは、数値を読み取って文字列に変換し、文字列に123.0や「123.0」などの数字が含まれている場合、文字列を読み取って数値を返すことができる機能です。 .

次に例を示します。

(defn cvt-str-num [val]
    (if (try 
            (number? val)
            (catch Exception e (str "Invalid number: " (.getMessage e))))
        (str val)
        (let [n-val (read-string val)]
            (if (number? n-val)
                n-val
                nil))))

n-val の let バインディングを回避する方法がわかりませんでした。これは、読み取り文字列の戻り値を格納するための一時的な場所が必要だったため、数値としてテストできるためです。数値の場合は返されます。それ以外の場合は nil が返されます。

于 2012-05-25T13:10:22.367 に答える