#PowerApps におけるデータ型変換

# Power Appsにおけるデータ型
Power Appsでは非常に多くのデータ型が識別され、利用されます。
Power Appsで利用可能なデータ型については(CDSの文脈も含めて)こちらの公式ドキュメントを参照してください。
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/data-types

今回はPower Appsの中でデータ型の変換を行うための操作(関数)を一部ご紹介します。


# データ型変換
今回はテーブル・レコード関連以外をご紹介します。
(それはそれですごく長いので。。。)
## Text → Number/Date/DateTime

### 1.テキスト型から数値型
これは素直に、**Value関数**を利用します。

```Text.toNumber
Value("123.50") => 123.5 //数字なら単純に数値に変換。最後の0はおとされる
Value("-123.50") => -123.5 //マイナス符号も可能
Value("123.5a") => Blank //英字を入れると変換できない
Value("12.35%") => 0.1235 //パーセントはそのまま1/100を返す
Value("123e+3") => 123000 //指数も利用可能。 e+12, e-12など
```

### 2.テキスト型から日付型
テキストから日付への変換は**DateValue関数**を利用します。

```Text.toDate
DateValue("2019年12月1日","ja-jp") => 2019/12/1
DateValue("2019/12/1","ja-jp") => 2019/12/1
DateValue("12/1/2019","ja-jp") => 2019/1/12
DateValue("12-1-2019","ja-jp") => 2019/1/12
DateValue("20191201","ja-jp") => 2019/12/1
```
Languageコードは忘れがちですけど、必ずつけましょうね。
MM/DD/YYYYのつもりでテキストに入っていても、ja-JPだと、DD/MM/YYYYと認識されるので、やっぱり明確に付けたほうがよいです。

### 3.テキスト型から日時型
日付とほとんど同じですが、時間も含めたDateTime型への変換は**DateTimeValue関数**です。

```Text.toDateTime
DateTimeValue("2019年12月1日 午前1時10分","ja-jp") => 2019/12/1 1:10 AM 日本語表記でもOK
DateTimeValue("2019/12/1 13:10","ja-jp") => 2019/12/1 13:10 AM/PMをつけなければ24時間表記
DateTimeValue("2019/12/1 1:10 PM","ja-jp") => 2019/12/1 1:10 PM AM/PMを付けるならhh:mmの後ろ
DateTimeValue("2019/12/1 1:10 午後","ja-jp") => 空 日本語と英語表記は混ぜてはいけない
```
あまりテキスト入力から日時に変換するというシーンはないかもしれませんが、SharePointの委任回避のためにテキスト型を利用したりするときには登場するかもしれません。


### テキスト型からの変換まとめ

| 変換先の型       |       利用する関数 |    例    |
|--------------|--------------------|--------------------------|
| Number             |Value(*Text*) | Value("123.5"), Value("-123.5"), Value("120 %")|
| Date           |DateValue(*Text*,*Language code*) |DateValue("2019年12月1日","ja-jp"), DateValue("12/1/2019","ja-jp")|
| DateTime            |DateTimeValue(*Text*,*Language code*) |DateTimeValue("2019年12月1日 午前1時10分","ja-jp"),DateTimeValue("2019/12/1 13:10","ja-jp")   |


## Number → Text/Date/DateTime
数値型からの変換ですが、基本的には数値を引数にする関数があまりないので、代表的なのはテキスト型、それを通じた日付・日時型くらいかと思います。

### 1. 数値からテキスト型
数値からテキスト型への変換は**Text関数**を使います。
Text関数自身が非常に多機能なので、詳細はDocsを参照してください。

代表的には以下のように利用します。

```Number.toText
Text(123.450,"#.###") => 123.45 //#で小数点以下を指定すると、基本的にはN桁表示するが、最後が0だと表示されない
Text(-123.450,"#.###") => -123.45 //マイナス符号も同様　
Text(123.450,"#.000") => 123.450 //小数点以下を0で指定すると、小数点以下N桁が保証される
Text(1234567890000,"yyyy/mm/dd") => 2009/02/14 //Unixtime stampも、日付フォーマットを指定すれば変換される
```

### 2. 数値型から日付型
Number->Text->Dateという2段階で、数値から日付型に変換できます。
非常に簡単には

```Number.toDate
DateValue(Text(1234567890000,"yyyy/mm/dd"),"ja-JP")
```
これで日付型として、2009年2月14日が返却されます。これを利用すると、数値で定義した列と、DatePickerの入力を比較できたりします。
（参考：[#PowerApps で日付でフィルターする場合](https://qiita.com/h-nagao/items/69a94184ac3ad96d4e5a)）

### 数値型からの変換まとめ
| 変換先の型       |       利用する関数 |    例    |
|--------------|--------------------|--------------------------|
| Text            |Text(*Number*, *Format*) | Text(123.50,"#.##"), Text(123.50,"#.0#"), Text(123456789000,"yyyy/mm/dd")|
| Date           |DateValue(Text(*Number*, "yyyy/mm/dd"),*Language*) |DateValue(Text(1234567890000,"yyyy/mm/dd"),"ja-jp")|


## Other
テーブルやレコード関連はここでは省略していますが、ほかにおもしろい変換があるので、ご紹介します。

### Boolean
数値やテキストからBoolean (true/false)を生成するには、

```
(1=1) => true
(1<>1) => false
("Hello"="Hello") => true
!("Hello"="Hello") => false
```
このように、カッコでくくって、比較演算子を利用してあげることで、Booleanを生成することができます。
例えば、AddColumnsして、ある列の値をもとに、Bool型の列を作成したい場合には
```AddColumns(XXXXX,"columnName" (refClmn="XXXX"))```こんな風にしてあげると、ある列(refClmn)の値に応じて、true/falseを追加できます。

### GUID
私は全然知らなったGUID型への変換です。そのまま、GUID関数を使います。
GUID関数は引数がなければあらたなGUIDを返し、引数があれば、GUID型に変換して値を返します。
詳細はやはり公式Docsを参照してください。
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-guid

### Upper/Lower/Proper
これは大文字・小文字・正規の文字列整形関数です。emailなどを比較する場合にUpperとLowerでそろえたりします。

### EncodeUrl
私は主にSVGを作るときに利用していますが、URLエンコードされた文字列を生成するのに利用します。あくまでもConvertではなくEncodeですね。


# おしまい
型変換はコード書いているときも結構出てきますが、Power Appsの文脈でもやはり多く使われます。
主には表示の整形ですが、それ以外にも、データ型を変換して、ほかの入力と比較する、JSON関数のように、データをメディアから取り出す、などなど意外と使いますので、**困ったときにはText関数とValue関数とDateTime関数を思い出しましょう！**
だいたいことたります！