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

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

【Power Apps】基数の変換を行うカスタム関数を作成しました!


スポンサードリンク

はじめに

Power Apps のカスタム関数を利用して、基数の変換を行う関数を作成しましたので、その紹介になります。

f:id:koruneko:20210315020449p:plain

なお、式の詳しい解説までは今回行いません。

もし気になる方は、コメントやTwitter などで私に質問していただければと思います。

twitter.com

作成したカスタム関数

HexToDecimal

こちらは16進数から10進数に変換を行うための関数です。
この関数は、Hiro さんのPower Apps の カスタム関数を作ってみよう #Example 2: 16進数から10進数に変換する関数を参考(ほぼ流用)に作成させていただきました。

プロパティ

  • 表示名 - HexToDecimal
  • 説明 - Hex → Decimal
  • プロパティの型 - 出力
  • データ型 - 数値

構文

HexToDecimal(Hex)
  • Hex - 必須。テキスト型。10進数に変換したい16進数。

// https://mofumofupower.hatenablog.com/entry/custom_function_apps
With(
    {
        tblDecimals: AddColumns(
            Sequence(Len(Hex), 0),
            "Decimals",
            With(
                {
                    HexVal: Mid(Hex, Len(Hex) - ThisRecord.Value, 1)
                },
                If(
                    HexVal in Sequence(10, 0), HexVal,
                    LookUp(
                        Table({key:"a", val:10}, {key:"b", val:11}, {key:"c", val:12}, {key:"d", val:13}, {key:"e", val:14}, {key:"f", val:15}),
                        key = Lower(HexVal)
                    ).val
                )
            )
        )
    },
    Sum(tblDecimals, Decimals  * 16 ^ Value)
)

DecimalToHex

こちらは10進数から16進数に変換を行うための関数です。

プロパティ

  • 表示名 - DecimalToHex
  • 説明 - Decimal → Hex
  • プロパティの型 - 出力
  • データ型 - テキスト

構文

DecimalToHex(Decimal)
  • Decimal - 必須。数値型。16進数に変換したい10進数。

With(
    {
        tblHexs: AddColumns(
            Sequence(RoundDown(Ln(Decimal) / Ln(16) + 1, 0), 0),
            "Hexs",
            If(
                ThisRecord.Value = 0, Mod(Decimal, 16),
                Mod(RoundDown((Decimal - Mod(Decimal, 16)) / Power(16, ThisRecord.Value), 0), 16)
            )
        )
    },
    Concat(Sort(tblHexs, Value, Descending),
        Switch(
            Hexs,
            10,"a", 11,"b", 12,"c", 13,"d", 14,"e", 15,"f",
            Hexs
        )
    )
)

BinaryToDecimal

こちらは2進数から10進数に変換を行うための関数です。

プロパティ

  • 表示名 - BinaryToDecimal
  • 説明 - Binary → Decimal
  • プロパティの型 - 出力
  • データ型 - 数値

構文

BinaryToDecimal(Binary)
  • Binary - 必須。数値型。10進数に変換したい2進数。

With(
    {
        tblDecimals: AddColumns(
            Sequence(Len(Text(Binary)), 0),
            "Decimals",
            Power(2, ThisRecord.Value) * Mid(Text(Binary), Len(Text(Binary)) - ThisRecord.Value, 1)
        )
    },
    Sum(tblDecimals, Decimals)
)

DecimalToBinary

こちらは2進数から10進数に変換を行うための関数です。

プロパティ

  • 表示名 - DecimalToBinary
  • 説明 - Decimal → Binary
  • プロパティの型 - 出力
  • データ型 - 数値

構文

DecimalToBinary(Decimal)
  • Decimal - 必須。数値型。2進数に変換したい10進数。

With(
    {
        tblBinaries: AddColumns(
            Sequence(RoundDown(Ln(Decimal) / Ln(2) + 1, 0), 0),
            "Binaries",
            If(
                ThisRecord.Value = 0, Mod(Decimal, 2),
                Mod(RoundDown(Decimal / Power(2, ThisRecord.Value), 0), 2)
            )
        )
    },
    Concat(Sort(tblBinaries, Value, Descending), Binaries & "")
)

現在確認しているバグ

現在以下バグを確認しています。
もし、修正案などある方は教えていただけますと助かります。

10進数から16進数の変換に関して

10進数から16進数の変換に

 \frac{\ln{(Decimal)}}{\ln{(16)}}

としていますが、こちら Decimal にて、  16^{12} - 1 以上の値を設定すると正確な結果が得られなくなります。
これは桁落ちが発生しているためです。

 \frac{\ln{(Decimal)}}{\ln{(16)}} = 11.999999999999998718629398474031
ですが、Power Apps でこちらを計算すると
Ln(281,474,976,710,655) / Ln(16) = 12 となります。(気になる人は試してみてください。)

10進数から2進数の変換に関して

10進数から2進数への変換の際に結果に 2 が出力される場合があります。

f:id:koruneko:20210315020402p:plain

ロジックのミスも疑いましたが、こちらの関数の式をアプリ内にべた書きした結果想定通りの結果が返ってきました。

f:id:koruneko:20210315020940p:plain

カスタム関数はまだプレビュー機能ですので、不具合の可能性もありますが引き続き調査を行います。

この事象の共通点は現在まだ発見できておりません。

もしなにかわかる方がいたら教えていただけますと助かります。

おわりに

今回紹介したカスタム関数は私の以下Github にて公開しておきました。

github.com

使用に関しては自己責任でお願いします。

不具合、ご要望があれば教えてください。

Github のReadMe でTeX の表示上手くいってないですね。
今度直さないと。。。


スポンサードリンク