2008年10月24日金曜日

整数を3けた区切り形式の文字列に変換する関数

この間の日曜日、基本情報処理技術者試験を受けに行ってきました。 合格するかどうかは正直微妙…

そこでこんな設問が

午後の問題 問6: [プログラムの説明] 金額を表すときのように、整数を3けた区切り形式の文字列に変換する関数 convert である。(以下略)
           表 変換例
┌────┬────────────┐
│  整数  │3けた区切り形式の文字列│
├────┼────────────┤
│1234567 │1,234,567               │
│ -57482 │-57,482                 │
│     63 │63                      │
│-999999 │-999,999                │
└────┴────────────┘

C言語での問題だったけど、なんとなく Lisp で解いてみた。
# 別に解答間違ったからその腹いせにじゃあないです :-(


((lambda (int &optional (interval 3) (comma ","))
   (reverse
    (with-output-to-string (*standard-output*)
      (with-input-from-string 
          (in (reverse (princ-to-string (abs int))))
        (do ((i 1 (1+ i)))
            ((not (listen in)))
          (princ (read-char in))
          (if (and (zerop (mod i interval))
                   (listen in))
              (princ comma)))
        (if (minusp int)
            (princ "-"))))))
 -123456789)                    ; => "-123,456,789"

でも CLer なら一行で十分だよね、というオチ。

(format nil "~:D" -123456789)   ; =>"-123,456,789"

0 件のコメント:

コメントを投稿