(defn num-as-words [n]
(let [words '("zero" "one" "two" "three" "four"
"five" "six" "seven" "eight" "nine")]
(clojure.string/join "-"
(map (fn [x] (nth words (Integer. (re-find #"\d" (str x)) ))) (str n)))))
Run Code Online (Sandbox Code Playgroud)
我写了这个函数,称为num-as-words,它取一个整数并将其显示为完整的单词,例如,如果你输入(123)它将返回(一二三).
我是用地图完成的,但我想知道是否有另一种方法呢?我还想知道是否有另一种方法来连接单词而不是clojure.string/join,我最初使用interpose但不喜欢它的输出方式,因为它看起来像("one"" - ""two "" - ""三").
非常感谢任何帮助,谢谢.
user=> (clojure.pprint/cl-format ; formatted printing
nil ; ... to a string
"~{~R~^-~}" ; format (see below)
(map ; map over characters
(fn [x] (Integer. (str x))) ; convert char to integer
(str 123))) ; convert number to string
"one-two-three"
Run Code Online (Sandbox Code Playgroud)
首先,我们将输入数字(在此处进行硬编码)"123"
强制转换为字符串并迭代生成的字符串字符,这要归功于map
.对于每个字符,我们构建一个包含该字符的字符串并将其解析为Integer
.因此,我们获得了一个数字列表.
更确切地说,(fn [x] ...)
是一个函数采用一个论点.您可能应该将其命名为char
(抱歉),因为我们会迭代字符.当我们评估时(str x)
,我们获得一个包含一个char的字符串,即x
.例如,如果是字符\2
,则生成的字符串为"2"
.该(Integer. string)
表格(注意点!)呼吁构造Integer
类,它解析字符串为整数.继续我们的示例,(Integer. "2")
将产生整数2.
我们用来cl-format
将数字列表打印成一个新的字符串(根据false
参数的要求).为此,我们指定格式如下:
~{...~}
遍历列表并在每个元素的大括号内执行格式.
~R
打印一个数字作为英文单词(1 => 1等)~^
~{...~}
当没有剩余参数时,转义迭代.因此,当我们打印最后一个数字时,~^
不会打印下面的部分.~^
仅仅是角色-
.这用于分隔字符串,但我们必须注意不要为循环的所有迭代打印破折号,否则结果字符串将以破折号结束.如果任何字符无法解析为整数,则该函数将报告错误.在将输入转换为字符串之前,您可能需要首先检查输入是否为正整数.