はじめに
Power Apps のカスタム関数を利用して、基数の変換を行う関数を作成しましたので、その紹介になります。
なお、式の詳しい解説までは今回行いません。
もし気になる方は、コメントやTwitter などで私に質問していただければと思います。
作成したカスタム関数
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進数の変換に
としていますが、こちら Decimal
にて、 以上の値を設定すると正確な結果が得られなくなります。
これは桁落ちが発生しているためです。
ですが、Power Apps でこちらを計算すると
Ln(281,474,976,710,655) / Ln(16) = 12
となります。(気になる人は試してみてください。)
10進数から2進数の変換に関して
10進数から2進数への変換の際に結果に 2
が出力される場合があります。
ロジックのミスも疑いましたが、こちらの関数の式をアプリ内にべた書きした結果想定通りの結果が返ってきました。
カスタム関数はまだプレビュー機能ですので、不具合の可能性もありますが引き続き調査を行います。
この事象の共通点は現在まだ発見できておりません。
もしなにかわかる方がいたら教えていただけますと助かります。
おわりに
今回紹介したカスタム関数は私の以下Github にて公開しておきました。
使用に関しては自己責任でお願いします。
不具合、ご要望があれば教えてください。