@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Common Lisp の format で数字の三桁カンマ区切り

Rails でいう number_to_currency みたいなやつは

(format nil "~:D" 120000)
; => 120,000

でできる。

ここの解説がわかりやすかった 。

format関数

(format nil "~10,'_,'.,4:D" 120000)
; => ___12.0000

padchar と commachar は '_ のようにシングルクォート一個の前置で書くようだ。理由はよくわからなかった。 ~D と書いても ~d と書いてもよいようだ(大文字小文字どちらでも結果は変わらない)

Emacs Lisp の format は書式が全然違う (sprintf に似ている)ので同じようなことはできそうになかった。

追記:

シングルクォートの件と大文字小文字の件はどちらもドキュメントに書いてあった。

CLHS: Section 22.3

The case of the directive character is ignored. Prefix parameters are notated as signed (sign is optional) decimal numbers, or as a single-quote followed by a character.

Emacs Lisp ビルトインの format 関数は Common Lisp の format 関数とは別物だが、 marmalade に cl-format という移植版があった。

https://marmalade-repo.org/packages/cl-format

(require 'package)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/") t)
(package-initialize)

(require 'cl-format)
(cl-format nil "~:d" 120000)
; => "120,000"

なお cl-format のほうは directive の大文字小文字を区別する。 ~D はダメで ~d と書かなくてはならない。理由は、ユーザー定義用に大文字を残してあるから、だそう。