大家好!我正在做的项目里需要识别一千以下用中文表达的数字,如“八百零九”。
因为没有需要,我暂时回避了“三百三”这种简略写法的识别,而只认“三百三十”。
下面是我目前的代码,欢迎批评!谢谢@_@
(defn chinese-number
{:test
#(let [f chinese-number]
(tt/comprehend-tests
(t/is (= 0 (f "零")))
(t/is (= 1 (f "一")))
(t/is (= 10 (f "十")))
(t/is (= 12 (f "十二")))
(t/is (= 20 (f "二十行")))
(t/is (= 34 (f "三十四")))
(t/is (= 567 (f "五百六十七")))
(t/is (= 809 (f "八百零九回")))))}
[s]
(let [nmap {\十 10 \百 100}
dmap {\零 0 \一 1 \二 2 \三 3 \四 4 \五 5 \六 6 \七 7 \八 8 \九 9}]
(let [c (first s)]
(cond (empty? s) 0
(= c \十) (+ 10 (chinese-number (rest s)))
(= c \零) (chinese-number (rest s))
(contains?
dmap c) (let [d (dmap c)
n (second s)]
(if (contains? nmap n)
(+ (* d (nmap n)) (chinese-number (nthrest s 2)))
d))
:else 0))))
注:其中 t
是 clojure.test
, tt/comprehend-tests
是我自己写的一个检查多个真值,有一个为否就报错的宏。
- 给“二十行”,抛出
NullPointerException
;于是给cond
加了:else
分支。 - 代码过长,导致需要用滚动条才能看完;于是把
cond
每个分支test expr
写在同一行了。