Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何将数字字符串转换为数字(十进制)和数字转换为字符串_String_Clojure_Decimal - Fatal编程技术网

String 如何将数字字符串转换为数字(十进制)和数字转换为字符串

String 如何将数字字符串转换为数字(十进制)和数字转换为字符串,string,clojure,decimal,String,Clojure,Decimal,如何编写函数将十进制数字符串转换为十进制数,将十进制数转换为字符串?此示例将数字字符串转换为数字 (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

如何编写函数将十进制数字符串转换为十进制数,将十进制数转换为字符串?

此示例将数字字符串转换为数字

(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

从您的问题来看,您似乎需要一个切换函数,即如果字符串包含数字,如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。

请注意,
读取字符串
为您提供一个浮点数,而不是十进制数:

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"

有非常方便的clojure函数可以将任何内容转换为字符串,并将类似数字的内容转换为BigDecimal:

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

我想这是clojure的经典方式。

@octopusgrabbus-谢谢你的帮助。你可能不应该在现实生活中使用这种方式。从文档中,它可以执行任意代码,这是一个巨大的安全漏洞。我认为
bigdec
是一个更好的解决方案。