Trailing Zero

 C#による開発において、数値を扱う事は常のことだ。で、浮動小数を扱うなら、doubleではなくdecimalにすべきというのは、よく知られていることだ。で、そのdecimalを扱う時、よくわからない事が起こる。decimalな数値をToStringメソッド(引数無)で文字列にした時、小数点もないのに、「.000」がつく事がある。
 Webサービス(WCFやSoap)経由でサーバーから値を受け取った時によく起こる。

デバッグ時は、普通の数値に見える。クイックウォッチなんかで見た時は「1」。
でもToString()すると、「1.000」になる。
一方、ソースコード上で、
var decVal = decimal.One;
System.Console.WriteLine(decVal.ToString());
としても、結果は「1」になる。何が違う?とおもいつつ、実害ないから良いかと放置しておいた。
 でも、この間、とある画面のとある数値用コントロールで、表示上の現象を指摘された事項がこれに絡んでいるものだったので、改めて調べる事になった。
 意味的には、「1」も「1.000」も変わらないが、視力が弱い人は、「一(1.000)」ではなく「千(1,000)」に見えることがある。これは業務上の処理において、非常に厄介な話で、確実にトラブルの元になる。やった後で気づいても、それでは遅いのだ。毎日毎日毎日、大量と言って良い件数を扱う現場の人に対して、「気をつけて見れば?」的な指摘にはほぼ意味がない。

Decimal 構造体
C#ではないが、データベースのdecimalに対しての記事
How do I interpret precision and scale of a number in a database?
ふむふむ。このScaleというやつが設定されている事で、出したくもない0が出ている感じなのか。では、どうやればこの0を消せるんだろ?という感じで調査続行。
 調べた結果、この小数点以下の0を「Trailing Zero」というらしい。何を今更的な話かもしれないが、しょうがない。weblioにも載っているOrz。
trailing zero
意味は「後置ゼロ」。そのまんまだな。で、その消し方というやつを調べてみたら、さすがのstackverflowさんにあった。
Remove trailing zeros?
ここでベストアンサーに選ばれているのは、ToStringの引数に書式を渡せって事なんだけど。問題の件は、その文字列化をコントロールがガメているので、そういうわけにもいかなかったりする。書式も「##0.###」で設定しても、やっぱり「0.000」で出てしまう。結局上の記事にある次善策を打つ事にした。要するに、拡張メソッドを作り、その内部で1で割るのだ。1で割っても結果は変わらないが、ゼロは消えてくれる。
public static class NumericExtensions {

public decimal Normalize(this decimal decVal) {
//decValはTrailing Zero付の数値
return decVal / 1.000000000m;
}
}
こうすることで、Trailing Zeroが消えるらしい。
分母の数は、扱うであろう数値(金額だの、数量だの、etc.)の有効桁数を考慮した桁数でいいかなという感じ。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m