- PR -

DecimalFormat について

投稿者投稿内容
flatline
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 102
投稿日時: 2007-11-29 20:34
すごく初歩的なことなのかもしれませんが、

コード:
NumberFormat formatter = new DecimalFormat("#,###");
System.out.println(formatter.format(0));



で、"0" と表示されるのはなぜでしょう?

"" になるのを期待していたのですが。
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2007-11-29 20:58
引用:

flatlineさんの書き込み (2007-11-29 20:34) より:

で、"0" と表示されるのはなぜでしょう?


そりゃ、数値用のフォーマットで数値を表示するんだからねえ。
引用:

"" になるのを期待していたのですが。


あんたの期待なんか関係ないよ。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-11-29 23:43
確かにjavadocには#の説明として
引用:

数字。ゼロだと表示されない


と書かれていますが…。

はっきりいえることはDecimalFormatは0という数字を1桁と扱うということです。
もし、0という数字が0桁扱いであれば空白となることでしょう。
しかし、数字のフォーマットにおいて、それは期待すべきものでしょうか?
flatline
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 102
投稿日時: 2007-11-30 00:04
引用:

はっきりいえることはDecimalFormatは0という数字を1桁と扱うということです。
もし、0という数字が0桁扱いであれば空白となることでしょう。
しかし、数字のフォーマットにおいて、それは期待すべきものでしょうか?



まあ、わかるんですけどね。ゼロが1桁の数字だということは。

たとえば給与明細票とかで、データベース上はいくつかの支給項目にゼロが
入っているが、画面上(または帳票上)はゼロを出力したくない、というときは
どのような方法を取りますか?

コード:
if(value == 0) {
    output = "";
} else {
    output = formatter.format(value);
}



とかやるのが、ちょっと面倒だったので。

tarnwo
ベテラン
会議室デビュー日: 2002/10/25
投稿数: 58
投稿日時: 2007-11-30 09:13
引用:

コード:
if(value == 0) {
    output = "";
} else {
    output = formatter.format(value);
}


とかやるのが、ちょっと面倒だったので。



NumberFormat#formatをオーバーライドして
上記処理を埋め込む。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-11-30 09:15
Excel や VB6 では、#,### と書式指定すれば 0 のときは空文字になりますよね。私も DecimalFormat は使い勝手が悪いと思っています。せめて、セミコロン区切りによる複数書式指定で、正数、負数、0、null の最大 4パターンの振り分けができたら良いのですが・・・。DecimalFormat では正数、負数の2パターンの振り分けしかできないうえに、負数パターンでのフォーマット動作がおかしい気がする・・・。

給与明細票ってことは業務系システム開発をしているのかな。今後もそういうことが続くのであれば、自作のフォーマッターを作っておくのが良いと思います。
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2007-12-01 10:11
javaの数値フォーマッタの設計思想として
formatで変換したものをparseで戻せるようにしておきたかったのではないでしょうか?
MessageFormatなどはどうなっているか分かりませんが、
数値や日付は逆変換できないと実用性がかなり低くなってしまうと思います。
parse時に、formatされた値で条件分岐しても良いですが、
それはオブジェクト指向から離れてしまう発想に思えます。

引用:

未記入さんの書き込み (2007-11-30 09:15) より:
せめて、セミコロン区切りによる複数書式指定で、正数、負数、0、null の最大 4パターンの振り分けができたら良いのですが・・・。


これは同意しかねます。
そもそも負数パターンはプレフィックスのみが使用されますので、他のFormatとインターフェースが統一されていると考えます。
パターンを値により変えるということをしてしまうと、利用者側の我々がおそらく混乱します。
(提示の例でいえば0, nullパターンへのアクセサメソッドなどは少なくとも追加されそうですし)

引用:

DecimalFormat では正数、負数の2パターンの振り分けしかできないうえに、負数パターンでのフォーマット動作がおかしい気がする・・・。


JavaのバグにはGUI系では結構ぶつかりますが、DecimalFormatでは遭遇したことがありません。
実装を思い返してみても結構使用していますので気になります。
特定バージョンの問題でしょうか?
「おかしい気がする」というのは抽象的に過ぎて見つけられそうにもありませんので
具体例(またはバグ報告のIDなど)を挙げていただけませんでしょうか?

引用:

給与明細票ってことは業務系システム開発をしているのかな。今後もそういうことが続くのであれば、自作のフォーマッターを作っておくのが良いと思います。


同意です。
もちは餅屋ということで、帳票用の外部アプリ(クラス)を利用すべきかもしれませんが。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-12-01 14:47
引用:

未記入さんの書き込み (2007-11-30 09:15) より:
Excel や VB6 では、#,### と書式指定すれば 0 のときは空文字になりますよね。


なるほど、そうですね。
思うのですが、「0件」を特別扱いするか、ということに通じる問題のような気がします。Excel の #,### に限らず、自分で普通にフォーマッターを最低限コーディングすると数値の 0 は ""(長さ0の文字列)になるのが自然だと思います(もし "0" を出力する仕様にするならば、入力が 0 の時だけ特別に if で切り分けているはず)。また、小数も考えると、いっそう、そう思います。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}

スキルアップ/キャリアアップ(JOB@IT)