编写一个函数来在Clojure中以完整的单词打印(非负)整数

dan*_*nfs 0 clojure

(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 "" - ""三").

非常感谢任何帮助,谢谢.

cor*_*ump 5

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等)
  • ~^~{...~}当没有剩余参数时,转义迭代.因此,当我们打印最后一个数字时,~^不会打印下面的部分.
  • 以下~^仅仅是角色-.这用于分隔字符串,但我们必须注意不要为循环的所有迭代打印破折号,否则结果字符串将以破折号结束.

如果任何字符无法解析为整数,则该函数将报告错误.在将输入转换为字符串之前,您可能需要首先检查输入是否为正整数.