読者です 読者をやめる 読者になる 読者になる

FIELD NOTES: 書を持って街へ出よう

合同会社フィールドワークス プログラマ兼代表のブログ

カスタム数値書式指定文字列による文字列整形プログラム

Microsoft Excelでは「ユーザー定義」,.Net Frameworkでは「カスタム数値書式指定文字列」と呼ばれる独特の記法がある。このカスタム数値書式指定文字列にしたがって,数値を文字列に変換するプログラムをOCamlで作成した。

カスタム数値書式指定文字列自体の仕様についてはMSDNなどで公開されているが,細かな仕様についての記述がなく苦労した。MSDNの「出力例」で仕様を類推したり,Excelの「セルの書式設定/ユーザ定義」で動作を確認しつつ現物合わせで調整した箇所もある。

ソースは公開するので,自由にご利用いただきたい(ダウンロード先:技術情報 - 合同会社フィールドワークス / Field Works, LLC)。動作確認は,Mac OS Xで行った。文字コードUTF-8を想定しているので,Windows等の環境では文字化けが発生するかもしれない。

私が気づいていない未知の仕様に気づいたり,問題を見つけた場合はご連絡願います。

ソースヘッダの一部を以下に示す。

  書式指定付き文字列変換関数

  MS Office/.Net Framework カスタム数値書式指定文字列形式の書式指定により,
  数値を文字列に変換します。

  【利用可能な書式指定文字】
  0             ゼロプレースホルダ
  #             桁プレースホルダ
  .             小数点
  ,             桁区切り記号,値の位取り
  %             パーセントプレースホルダ
  \<文字>       エスケープ文字
  '<文字列>', "<文字列>" リテラル文字列
  ;             セクション区切り記号(最大3セクション:正;負;ゼロ)
  その他の文字  結果の文字列にコピーされる。
  ※指数表記(E0, E+0, e-00,...)には未対応です。

  【利用可能なエスケープ文字】
  \b            バックスペース(BS)
  \n            行送り(LF)
  \r            復帰(CR)
  \t            水平タブ(TAB)
  \u<HHHH>      16進数値HHHHを持つUNICODE文字
  \<文字>       文字自身

  【使用例】
  format_int 123 "#####" -> "123"
  format_int 123 "00000" -> "00123"
  format_int 1234567890 "(###)###-####" -> "(123)456-7890"
  format_float 1.2 "#.##" -> "1.2"
  format_float 1.2 "0.00" -> "1.20"
  format_float 1.2 "00.00" -> "01.20"
  format_int 1234567890 "#,#" -> "1,234,567,890"
  format_int 1234567890 "#,," -> "1235"
  format_int 1234567890 "#,,," -> "1"
  format_int 1234567890 "#,##0,," -> "1,235"
  format_float 0.086 "#0.##%" -> "8.6%"
  format_int 123456 "[##-##-##]" -> "[12-34-56]"
  format_int 1234 "##;(##)" -> "1234"
  format_int (-1234) "##;(##)" -> "(1234)" v}