Help us understand the problem. What is going on with this article?

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

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

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

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

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

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

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を発生させます。以下の例はいずれもエラーになります。

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

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

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

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

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

文字列への変換

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

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

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

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

文字への変換

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

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

文字から数値への変換

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

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

数値型同士の変換

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

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

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

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

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

数値を整数に変換する

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

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

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

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

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

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

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

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

変換のための一般関数

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

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

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

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

tryparse.(Int,["1","2","3"])     # 整数の配列 [1,2,3] を返す
@. tryparse(Int,["1","2","3"])   # 上に同じ
mametank
主にFortran,Julia,Rで数値計算と統計モデリングをやっています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away