コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

Power Automateで数値の切捨て / 切上げ / 四捨五入を行う


スポンサードリンク

はじめに

Power AppsにはRound、RoundDown、RoundUp、および Trunc関数という切捨て、切上げ、四捨五入を行う関数があるのに、なんでPower Automateにはそれと同等の関数がないんですかね...?

docs.microsoft.com

不便じゃない?と思ったので切捨て、切上げ、四捨五入を行う式を作成してみました。

ものすごくだるかったですね。

インプット値

インプット値は、切捨て、切上げ、四捨五入をする数値と少数N桁まで表示させる。ということを表す数値です。

名前 内部名
triggerBody()['number']
小数点以下 triggerBody()['number_1']

内部名 = 数式内で扱うときの動的な値です。
数式をコピペする際に、適宜置き換えてください。

四捨五入

これが一番簡単ですね。
四捨五入というより正確にいうと丸めですが。

float(
    formatNumber(triggerBody()['number'], concat('F', triggerBody()['number_1']))
)

ただ、数値のフォーマットを行っているだけですね。

F[N]で少数N桁の数値に丸めます。

F3だと少数3桁の数値に丸められますね。

詳しくはHiroさんのブログを参照。

qiita.com

その他フォーマットはこちらを参照。

docs.microsoft.com

切捨て

切捨てを行うようなフォーマットはないので、ここからは自作していきます。
切捨ては、少数N桁まで。とした場合は「 . 」(小数点)のあるところからN桁までの数値を取得すればいいですね。

これを実現するためにslice関数を利用します。

ただ1点気を付けなくてはならないのが、
元となる数値の小数点以下の桁数 = 切捨てを行う小数点以下の桁数
となった場合、slice関数で取得できる値が空白になってしまうので、その場合の処理が必要です。

数式にすると、以下のようになります。

float(
    if(
        equals(
            length(string(triggerBody()['number'])), 
            add(
                indexOf(string(triggerBody()['number']), '.'),
                add(1, triggerBody()['number_1'])
            )
        ), 
        triggerBody()['number'],
        slice(
            string(triggerBody()['number']),
            0,
            mul(
                sub(
                    length(string(triggerBody()['number'])), 
                    add(
                        indexOf(string(triggerBody()['number']), '.'),
                        add(1, triggerBody()['number_1'])
                    )
                ), 
                -1
            )
        )
    )
)

切上げ

一番めんどくさいやつです。

まずは式だけ書いておきます。

float(
    if(
        equals(
            length(string(triggerBody()['number'])), 
            add(
                indexOf(string(triggerBody()['number']), '.'),
                add(1, triggerBody()['number_1'])
            )
        ), 
        triggerBody()['number'],
        if(
            empty(
                slice(
                    string(triggerBody()['number']),
                    mul(
                        sub(
                            length(string(triggerBody()['number'])), 
                            add(
                                indexOf(string(triggerBody()['number']), '.'),
                                sub(
                                    add(1, max(triggerBody()['number_1'], 1)),
                                    1
                                )
                            )
                        ), 
                        -1
                    ),
                    mul(
                        sub(
                            length(string(triggerBody()['number'])), 
                            add(
                                indexOf(string(triggerBody()['number']), '.'),
                                add(1, triggerBody()['number_1'])
                            )
                        ), 
                        -1
                    )
                )
            ),
            add(
                int(
                    slice(
                        string(triggerBody()['number']),
                        0,
                        mul(
                            sub(
                                length(string(triggerBody()['number'])), 
                                add(
                                    indexOf(string(triggerBody()['number']), '.'),
                                sub(
                                    add(1, triggerBody()['number_1']),
                                    1
                                )
                                )
                            ), 
                            -1
                        )
                    )
                ),
                1
            ),
            concat(
                slice(
                    string(triggerBody()['number']),
                    0,
                    mul(
                        sub(
                            length(string(triggerBody()['number'])), 
                            add(
                                indexOf(string(triggerBody()['number']), '.'),
                            sub(
                                add(1, triggerBody()['number_1']),
                                1
                            )
                            )
                        ), 
                        -1
                    )
                ),
                add(
                    int(
                        slice(
                            string(triggerBody()['number']),
                            mul(
                                sub(
                                    length(string(triggerBody()['number'])), 
                                    add(
                                        indexOf(string(triggerBody()['number']), '.'),
                                        sub(
                                            add(1, max(triggerBody()['number_1'], 1)),
                                            1
                                        )
                                    )
                                ), 
                                -1
                            ),
                            mul(
                                sub(
                                    length(string(triggerBody()['number'])), 
                                    add(
                                        indexOf(string(triggerBody()['number']), '.'),
                                        add(1, triggerBody()['number_1'])
                                    )
                                ), 
                                -1
                            )
                        )
                    ),
                    1
                )
            )
        )
    )
)

読み解く気もなくなるほど長いですねw

簡単に説明すると、まず最初のif関数の箇所は先ほどの切捨て同様
元となる数値の小数点以下の桁数 = 切捨てを行う小数点以下の桁数
となった場合の処理になります。

なので、1つ目にif関数の結果がfalseの場合の数式が切上げを行っている処理のメインになります。

切上げは以下のように実現しています。

少数N桁とした場合、少数N - 1桁までの値を取得してきます。
少数N - 1桁までの値は変わらないのでそのままslice関数で取得するのでいいですね。

切上げなので、少数N桁目の値を + 1してあげる必要があります。

よって、 「少数N - 1桁までの値」 と 「少数N桁目の値に + 1した値」を文字列として結合してあげて、それを数値に戻せばいいですね。
それをこの数式では行っています。

おわりに

なんか切上げの数式ごちゃごちゃやっちゃったけど、もうちょっと簡単にかけそうな気がしますね。


スポンサードリンク