SQLite | 小数点以下の桁ぞろえをして表示する

SQLite | 小数点以下の桁ぞろえをして表示する

ハミ出した桁を四捨五入するだけなら round 関数でいいんですけど、桁数が足りないときに 0 を補って桁をそろえて表示したかった! (^^;
ググってみたけど、少なくとも上位の方に目的のブツがヒットしなかったので、結局自作。
データベース使いこなしてる人々にとってはスグ作れちゃう程度のものかもしれないけど、自分は初心者なのでとりあえずメモを残しておきます (^^;
※桁がハミ出したときは四捨五入でなく切り捨てになってます

1.とりあえず動くやつ

例: 小数点以下 3桁 に統一

select substr(cast(r as real) || d, 1, length(cast(r as integer)) + length(d) + 1) from (select <カラム名や数式> as r, '000' as d);

サブクエリのカラム 'd' で桁数分の '0' を指定すると、それより桁が長ければ「切り捨て」、短ければ「0 を補い」ます。

本当は桁数を数で指定できればいいんですけど、 SQLite には、文字列を繰り返す replicate 関数がないし、簡単に指定回数だけ文字列を繰り返す方法がわからなかったので、直接、桁を補うための '0' の文字列を指定することにしました (^^;
※2015/07/04 追記 ここから
カンタンに指定文字数分の '0' を生成する方法がわかってしまいました (^^;
zeroblob 関数で 0x00 の列を作り、hex や quote 関数で文字列化してやればいいみたいです。
修正版

select substr(cast(r as real) || substr(hex(zeroblob((d + 1) / 2)), 1, d), 1, length(cast(r as integer)) + d + 1) from (select <カラム名や数式> as r, <桁数> as d);

※追記ここまで

2.ちょっとまとめたやつ

あらかじめ表示したい桁数が決まっているのであれば、こんな風にしたほうが効率的かも
例: 小数点以下 3桁 に統一

select substr(cast(<カラム名や数式> as real) || '000', 1, length(cast(<カラム名や数式> as integer)) + 3 + 1);

本当は REAL 型に CAST している時点で小数点以下 1 桁は絶対確保されるので、'0' が並ぶ文字列は桁数より 1 少なくていいのですが、念のため、前の例と比較したときに混乱しないように統一して書いてみました。
また、<数式> が real か integer かが決まっていれば、どちらか cast する必要がなくなりますね (^^
SQL文内で割り算する時とか。

3.実行例

※少し書き方を変えています

4.バグなど

ただし、指定した数が、文字列化した時に指数表示されてしまうもの (有効桁数が少ない割に桁数が大きい数?) を指定してしまうと、この方法だと単純に文字列を処理してるだけなので、表示バグります (^^; 
小数点以下の方は、一回 round かければ良いと思うんですけど、小数点以上はどうしたら良いんだろう。。。

まあ、わざわざ小数点以下の桁数そろえたいってことは、ある程度、どんな値が来るのか分かってるって事だろうから、とりあえず困らないでしょたぶん (^^;
実際自分が使いたいのは、0.001~100.000 の範囲だけだし!
それじゃ今回はこのへんで~
またいつか~ ノシ


「SQLite | 小数点以下の桁ぞろえをして表示する」への2件のフィードバック

  1. おはようございます。
    やっぱケルパニさんは、
    頭が良いと思います!
    (キッパリw

    訳わかんなくても
    なんか凄いってのだけは
    Blog読んでたら分かります。
    👏👏👏👏👏拍手‼️

  2. ありがとうございます! (^^
    でも、そんなたいしたことでもないですよぅ~

コメントは受け付けていません。