Juliaでの整数・浮動小数点数・文字列・文字間の型変換

Juliaで型を変換する方法を紹介します。なお，Juliaでの型変換には数多くの方法がありますが，ここではその一部だけを紹介します。

ここで紹介するのは，スカラ（単一の値）に関するものです。もし，配列内の全要素を変換したければ，後述するbroadcast演算子を使うとよいでしょう。

# 文字と文字列に関する変換

## 文字列から他の型への変換

もっとも簡単な方法は，関数`parse()`を使うことです。変換先の数値型に続けて，文字列を与えます。

```julia
parse(Int,"16")       # 整数の 16
parse(Float64,"16")   # 倍精度浮動小数点数の 16.0
parse(Bool,"1")       # 真偽型の true (Julia 1.1以降)
parse(Bool,"0")       # 真偽型の false (Julia 1.1以降)
```

与えた文字列が妥当でないなら，`parse()`は`ArgumentError`を発生させます。以下の例はいずれもエラーになります。

```julia
parse(Int,"a")           # 変換できない
parse(Float64,"1e-400")  # 表現できる値の範囲外
parse(Bool,"-1")         # 真偽型は0か1しか受け付けない (Julia 1.1以降)
```

文字列の変換に失敗したときにエラーを発生させず，かわりに`nothing`を返すには，`tryparse()`を利用します。正常に変換できたときには，その変換後の値を返します。

```julia
tryparse(Int,"16")          # 整数の16を返す
tryparse(Int,"a")           # nothingを返す
```

文字列から文字を抽出する場合，文字列型がUTF-8でエンコードされていることを念頭に置く必要があります。もし文字列が1バイト文字だけで構成されているなら，その特定バイトを抽出すれば，それが文字として扱われます。もし多バイト文字が含まれるなら，その抽出は単純ではありません（たとえば[Julia その２ 文字列関係](https://qiita.com/hidemotoNakada/items/505ccbb4dc015a0c4fca)や[Julia でテキスト処理](https://qiita.com/Rshimura/items/4389d164840589a14ec6)を参照）。以下の例では，簡単だが非効率な方法（`split`でテンポラリ配列を作る方法）で文字を抽出しています。

```julia
"ABCDE"[2]   # 2バイト目の文字 'B'
"日本語"[2]   # エラーが返る
"日本語"[4]   # 4バイト目からの文字 '本'
# 文字列を文字配列にし，その2文字目を文字列として抽出（非効率）
(split("日本語","")[2])[1]
```

## 文字列への変換

特にフォーマットを気にしないなら，関数`string()`を使います。JuliaのREPLに表示するのと同じフォーマットで文字列を作ります。

```julia
string(1)     # 文字列 "1"
string(3.14)  # 文字列 "3.14"
string(22/7)  # 文字列 "3.142857142857143"
string(π)     # 文字列 "π = 3.1415926535897..."
string('a')   # 文字列 "a"
```

より詳細にフォーマットを指定するなら，C言語と同様の使い方ができる`@sprintf`マクロを利用するとよいでしょう。これは標準パッケージの`Printf`に含まれます。

```julia
using Printf
@sprintf("%6.2f",π)  # 文字列 "  3.14"
```

## 文字への変換

`Char()`を使えば，UTF-8コードを文字に変換することができます。

```julia
Char(65)      # 文字 'A'
Char(0x672c)  # 文字 '本'
```

## 文字から数値への変換

`Int()`で数値に変換できます。また、文字に整数を加減算すると、文字コードに数値を加算することになり、結果の数値が文字として戻ります。

```julia
Int('A')     # 整数 65
Int8('A')    # 1バイト整数 65
'A'+1        # ASCII/Unicode文字 'B' (66)
'A'+200      # Unicode文字 'ĉ' (265)
```

# 数値型同士の変換

## 数値を浮動小数点数に変換する

関数`float()`が利用できます。これはデフォルトで`Float64`への変換を行います。

```julia
float(3)     # 倍精度で3.0
float(π)     # 倍精度で3.141592653589793
```

明示的に変換後の型を指定するときには，`Float64()`（倍精度）または`Float32()`（単精度）を使うとよいでしょう。

```julia
Float64(3)   # 3.0
Float64(π)   # 3.141592653589793
```

## 数値を整数に変換する

### ある型の整数を別の型の整数に変換する

整数を整数に変換するには，型名を冠した関数`Int64()`，`Int32()`，`UInt64()`などが利用できます。これらの関数に整数以外の値を与えると，エラーが発生します。

```julia
Int(5)     # Int64として5
UInt(5)    # Unsigned int として 0x0000000000000005
Int(3.14)  # エラー発生
```

### 浮動小数点数を整数に変換する

浮動小数点数を整数に変換するときには，小数点以下の丸めをどう処理するかという問題があります。もし小数点以下の数値がなければ，この値は`Int()`系の関数でそのまま整数に変換できます。この関数を一般の浮動小数点数に当てはめると，エラー（InexactError）が発生します。これは，小数点以下の丸めによって得られる整数が変わるため，整数への変換が一意に決まらないためです。

```julia
Int(3.0)     # 整数3が得られる
Int(3.14)    # エラーが発生する
```

浮動小数点数を丸める関数として，床関数`floor()`，天井関数`ceiling()`，近傍の整数への丸めを行う`round()`などが使えます。これらの関数は，デフォルトでは，浮動小数点数を返しますが，第1引数に任意の整数型を指定することで整数に変換することができます。

```julia
floor(3.14)       # 浮動小数点数3.0を返す
Int(floor(3.14))  # これをInt64の整数3に変換する
floor(Int,3.14)   # 上に同じ
```

### 変換のための一般関数

Juliaには，値の変換を行うための一般的な関数`convert()`があります。この関数では，変換後の型名を明示します。上記の個別の関数は，すべてこの関数に集約できます。

```julia
convert(Float64,3)   # 浮動小数点数3.0
convert(Int,3.00)    # 整数3
convert(Int,3.14)    # エラー：丸めが指定されていない
convert(Int,round(3.14))   # 変換可
```

# 配列内の要素をまとめて変換

変換すべき要素が配列に含まれていて，その配列全体をまとめて変換したい場合，ドット演算子（broadcast）を使います。以下の例は，文字列の配列を数値配列に変換する例です。

```julia
tryparse.(Int,["1","2","3"])     # 整数の配列 [1,2,3] を返す
@. tryparse(Int,["1","2","3"])   # 上に同じ
```