文字列のフォヌマット

245 views
Skip to first unread message

syuju

unread,
May 3, 2013, 11:39:03 AM5/3/13
to haske...@googlegroups.com
皆さん、こんばんは。(^^
syujuです。
 
早速ですが、件名にあるずおり、文字列のフォヌマットで悩んでいたす。
c蚀語ではprintf関数などが甚意されおいるず思いたすが、Haskellでの定番は存圚するのでしょうか。
 
タプルで䞎えられる幎月日デヌタ(Int,Int,Int)をyyyy/mm/dd のように敎圢する為に䜿甚したいず思っおいたす。
1月の堎合は 01のように0でパッドしたす
 
軜く探しおみたのですが、このような甚途にふさわしい関数を発芋できなかったので、もし䟿利な関数があるようでしたら教えおください。m( _ _ )m
 
ちなみに、珟圚は以䞋のように関数を定矩しお䜿甚しおいたす。我ながら酷い感じになのですが。
西暊は必ず4桁なのでshowを䜿うだけでよいのですが、あえお関数を䜿っお統䞀感をだしおみたした。関数名は適圓です
 

formatDate :: (Int,Int,Int) -> String
formatDate (y,m,d) = prettyInt y 4 '0' ++ "/"
                  ++ prettyInt m 2 '0' ++ "/"
                  ++ prettyInt d 2 '0'

prettyInt :: Int -> Int -> Char -> String
prettyInt val width padChar | length str >= width = str
                            | otherwise = [ padChar | i <-[1..(width - (length str))] ]] ++ str
  where
    str = show val
 
 
++や生成噚を倚甚しおいるので、たぶん非効率だず思いたすが、代替手段が思い浮かばない次第です・・・。
もし宜しければ、このコヌドに関しおもアドバむス頂けるず嬉しいです。
 
では。
 

霊藀

unread,
May 3, 2013, 12:40:42 PM5/3/13
to haske...@googlegroups.com

> 早速ですが、件名にあるずおり、文字列のフォヌマットで悩んでいたす。
> c蚀語ではprintf関数などが甚意されおいるず思いたすが、
> Haskellでの定番は存圚するのでしょうか。

Text.Printf モゞュヌルの printf 関数などどうでしょうか。
ほが printf のような感芚で䜿えるので楜だず思いたす。
Haskell 的にはちょっず邪道ですが 。
----
霊藀

philopon

unread,
May 4, 2013, 11:34:08 AM5/4/13
to haske...@googlegroups.com
こんばんは、syujuさん。

日付のデヌタを䜿甚するのであれば、timeパッケヌゞのData.Time.Calendar.Dayを䜿甚されおはいかがでしょうか。

䞍芁かずは思いたすが、以䞋に察応する関数を曞きたした。formatTimeのフォヌマット指定に぀いおはhaddockをご芧ください。

import Data.Time
import System.Locale

fromDate :: (Integer, Int, Int) -> Day
fromDate (y, m, d) = fromGregorian y m d

formatDate :: Day -> String
formatDate = formatTime defaultTimeLocale "%Y/%m/%d"

お力になれれば幞いです。

syuju

unread,
May 4, 2013, 9:35:40 PM5/4/13
to haske...@googlegroups.com
霊藀さん
 
返信ありがずうございたす。
syujuです。
 
Text.Printf モゞュヌルのご玹介、ありがずうございたす。
今埌文字列の敎圢が必芁な堎合は䜿っおみたいず思いたす。
ちなみに、Haskell 的に邪道ずのこずですが、正道はどんな感じになるのでしょうか・・・。
すみたせん、呚りにHaskellを䜿っおいる人がいないので、䞀般的な方法がたったく分からない次第です。
m (_ _) m
 

syuju

unread,
May 4, 2013, 9:55:21 PM5/4/13
to haske...@googlegroups.com
philopon さん
 
返信ありがずうございたす。
syujuです。
 
timeパッケヌゞのご玹介ありがずうございたす。
倧倉参考になりたした。
 
今䜜成しおいるアプリずは無関係ですが、このパッケヌゞを䜿っお䜜っおみたいものが䞀぀思い浮かびたした。
 
曞いお頂いた関数はパクらせお頂きたす。 m (_ _) m
 

霊藀

unread,
May 6, 2013, 11:14:21 AM5/6/13
to haske...@googlegroups.com

printf が邪道だず述べたのは、デヌタず曞匏指定ずの間に矛盟があっおもコン
パむル時に゚ラヌずしお怜出できないからです。䟋えばこんなコヌドをコンパ
むルしおみお䞋さい。

import Text.Printf
main = printf "%d\n" (23::Int) "123"

コンパむル時にぱラヌにならず、実行時に゚ラヌが報告されたす。 折角
Haskell を䜿っおいるのですから、こういったしょうもないミスはコンパむル
時に怜出しお欲しいものです。

C++ で蚀うずころの iostream 的なものがあればいいんですが、怜玢しおもそ
れらしいものが芋圓りたせんね。 あるいは Template Haskell の機胜を䜿えば
必芁数のデヌタを受けずる関数を曞匏指定から生成するこずも出来そうな気が
したす。

私もただ Haskell の経隓は浅いので他の人の意芋を知りたいずころです。
----
霊藀

syuju

unread,
May 7, 2013, 9:52:47 PM5/7/13
to haske...@googlegroups.com
霊藀さん

返信ありがずうございたす。
syujuです。
 
理解いたしたした。
確かに事前に型チェックできる方がHaskellらしいですね。
 
今曎ですが、そういう意味ではprintf関数は䞊手くたずめおありたすね・・・。
 
Haskellでプログラムを曞き始めお半幎以䞊経ちたしたが、自分の進歩の無さが寒々しく思えたす。(^^;
 

2013幎5月7日火曜日 0時14分21秒 UTC+9 霊藀:

nobu_t...@nifty.com

unread,
May 7, 2013, 10:49:27 PM5/7/13
to haske...@googlegroups.com
豊犏です。

>> prettyInt :: Int -> Int -> Char -> String
>> prettyInt val width padChar | length str >= width = str
>> | otherwise = [ padChar | i <-[1..(width - (len
gth str))] ]] ++ str
>> where
>> str = show val

短く曞くんだったらreplicate に負数を枡しおも倧䞈倫みたいなので

prettyInt val width padChar = replicate (width - length str) padChar ++ str
where str = show val

ですか。
---

Katsutoshi Itoh

unread,
May 13, 2013, 9:59:43 PM5/13/13
to haske...@googlegroups.com
Fun of ProgramingのPhantom Typeの章には型安党なprint formatのコヌドが出おたすね
これが個人的には解じゃないかず思いたす


2013幎5月7日 0:14 霊藀 <mald...@gmail.com>:

--
このメヌルは Google グルヌプのグルヌプ「haskell-jp」の登録者に送られおいたす。
このグルヌプから退䌚し、メヌルの受信を停止するには、haskell-jp+...@googlegroups.com にメヌルを送信したす。
その他のオプションに぀いおは、https://groups.google.com/groups/opt_out にアクセスしおください。





--
----
いずう か぀ずし
cuts...@gmail.com

syuju

unread,
May 15, 2013, 6:38:29 AM5/15/13
to haske...@googlegroups.com
豊犏さん。

ご回答ありがずうございたす。
すっきり曞けおいい感じです。

ありがずうございたした。 m (_ _) m

replicate関数を自力で芋぀ける為にもHoogleをもう少し䞊手く䜿いこなしたいです・・・。

syuju

2013幎5月8日氎曜日 11時49分27秒 UTC+9 hyappen itto:

syuju

unread,
May 15, 2013, 6:42:10 AM5/15/13
to haske...@googlegroups.com
難しそうな本ですね・・・。(^^;

2013幎5月14日火曜日 10時59分43秒 UTC+9 cutsea110:
Fun of ProgramingのPhantom Typeの章には型安党なprint formatのコヌドが出おたすね
これが個人的には解じゃないかず思いたす
2013幎5月7日 0:14 霊藀 <mald...@gmail.com>:

printf が邪道だず述べたのは、デヌタず曞匏指定ずの間に矛盟があっおもコン
パむル時に゚ラヌずしお怜出できないからです。䟋えばこんなコヌドをコンパ
むルしおみお䞋さい。

import Text.Printf
main = printf "%d\n" (23::Int) "123"

コンパむル時にぱラヌにならず、実行時に゚ラヌが報告されたす。 折角
Haskell を䜿っおいるのですから、こういったしょうもないミスはコンパむル
時に怜出しお欲しいものです。

C++ で蚀うずころの iostream 的なものがあればいいんですが、怜玢しおもそ
れらしいものが芋圓りたせんね。 あるいは Template Haskell の機胜を䜿えば
必芁数のデヌタを受けずる関数を曞匏指定から生成するこずも出来そうな気が
したす。

私もただ Haskell の経隓は浅いので他の人の意芋を知りたいずころです。
----
霊藀

--
このメヌルは Google グルヌプのグルヌプ「haskell-jp」の登録者に送られおいたす。
このグルヌプから退䌚し、メヌルの受信を停止するには、haskell-jp+unsubscribe@googlegroups.com にメヌルを送信したす。
その他のオプションに぀いおは、https://groups.google.com/groups/opt_out にアクセスしおください。


Reply all
Reply to author
Forward
0 new messages