gpt4 book ai didi

parsing - 在 ClojureScript 程序中使用 Cuerdas 解析十进制数

转载 作者:行者123 更新时间:2023-12-04 04:04:45 26 4
gpt4 key购买 nike

我正在使用 Cuerdas library在一个解析 float 的 ClojureScript 程序。有时输入来自用户缺少不可或缺的部分,例如 .1 表示 0.1。我需要处理这个。但是在比较解析后的数字时我遇到了奇怪的结果:

(= 0.1 (parse-number "0.1"))
;; => true

(= .1 (parse-number "0.1"))
;; => true

(= 0.1 (parse-number ".1"))
;; => false

(= .1 (parse-number ".1"))
;; => false

上面的最后两个结果让我感到惊讶。比较文字数字时我得到预期的结果:

(= 0 .0)
;; => true

当我只解析没有整数的十进制数时,奇怪的行为也可见部分,就像这里:

(parse-number ".1")
;; => .1

.1
;; => 0.1

我发现我可以使用 js/parseFloat 来得到我想要的东西,但我很好奇使用 Cuerdas 时出现这种行为的原因是什么?这个 .1 值是多少它与 0.1 有何不同?

最佳答案

parse-number来源看起来像这样:

(defn parse-number
"General purpose function for parse number like
string to number. It works with both integers
and floats."
[s]
(if (nil? s)
#?(:cljs js/NaN :clj Double/NaN)
(if (numeric? s)
(edn/read-string s)
#?(:cljs js/NaN :clj Double/NaN))))

".1""0.1" 都被认为是numeric? (通过正则表达式检查在 cuerdas 中实现):

cljs.user=> (def re #"^[+-]?([0-9]*\.?[0-9]+|[0-9]+\.?[0-9]*)([eE][+-]?[0-9]+)?$")
#'cljs.user/re
cljs.user=> (boolean (re-matches re "0.1"))
true
cljs.user=> (boolean (re-matches re ".1"))
true

所以它们将被 cljs.reader/read-string 读取.

当读取字符串 "0.1" 时,返回类型是 js/Number,但是 ".1" 类型>cljs.core/符号:

cljs.user=> (cljs.reader/read-string ".1")
.1
cljs.user=> (cljs.reader/read-string "0.1")
0.1
cljs.user=> (type (cljs.reader/read-string "0.1"))
#object[Number]
cljs.user=> (type (cljs.reader/read-string ".1"))
cljs.core/Symbol

因此,虽然它看起来正确地解析了 .1,但实际上它把它变成了一个符号。符号 .1 不等于数字 .1

注意 parse-numberno longer available in newer versions cuerdas 因为它“是一个字符串操作库而不是数字解析库”。

关于parsing - 在 ClojureScript 程序中使用 Cuerdas 解析十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62716573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com