数値を3桁ずつカンマで区切って表示する
数値を表示用の文字列に変換します.
それには,いくつもの方法がありますが,その中で判りやすそうなものを紹介します.
最初に文字列に変換する
(1)最初に数値を表示用文字列に変換してから,
(2)文字列を逆順にし,
(3)左から3文字づつ区切って,
(4)カンマを間に挟んで連結し,
(5)全体を逆順にします.
code:haskell
import Data.List (intercalate, unfoldr)
cint :: Int -> String
cint = reverse -- (5)逆順の文字列に変換
. intercalate "," -- (4)カンマを間に挟んで連結
. splitBy 3 -- (3)先頭から3文字ずつ取った文字列のリストを構成
. reverse -- (2)逆順の文字列に変換
. show -- (1)数値を表示用文字列に変換
splitBy n = unfoldr phi
where
phi [] = Nothing
phi cs = Just (splitAt n cs)
評価例
code:haskell
splitBy 3 "0987654321"
cint 1234567890
"1,234,567,890"
1000進表現に変換してから文字列に変換する
(1)最初に1000進表現(各桁を要素とするリスト)に変換してから,
(2)各桁を文字列に変換して,
(3)カンマを間に挟んで連結します.
code:haskell
import Data.List (intercalate, unfoldr)
import Data.Tuple (swap)
cint' :: Int -> String
cint' = intercarate "," -- (3)カンマを間に挟んで連結
. map show -- (2)各桁を文字列に変換
. positionalBy 1000 -- (1)1000進表現に変換
positionalBy :: Int -> Int -> Int positionalBy n = reverse . unfoldr phi
where
phi 0 = Nothing
phi m = Just (swap (m divMod n))
評価例
code:haskell
positionalBy 1000 1234567890
cint' 1234567890
"1,234,567,890"