文字列を数値に変換するには?to○○メソッドと注意点について

Scala 3 (Dotty 0.26.0-RC1) 2.13.3 2.12.12
最終更新:2020年5月19日

[AD] scalapediaでは記事作成ボランティアを募集しています

Scalaで文字列を数値に変換する方法をご紹介します。

変換できる数値型

Scalaでは、文字列を以下の数値型に変換することができます。

  • Int
  • Long
  • Short
  • Double
  • Float
  • Byte

数値に変換するメソッド

Stringクラスに、以下のように各数値型に変換するメソッドが用意されていますので、それらのメソッドを呼び出して数値に変換します。

メソッド戻り値
InttoIntInt
LongtoLongLong
ShorttoShortShort
FloattoFloatFloat
DoubletoDoubleDouble
BytetoByteByte

それでは、文字列を数値型に変換してみます。

// 変換する文字列 val str: String = "123" // Intへの変換 val i: Int = str.toInt println(s"type=${i.getClass()}, val=${i}") // Longへの変換 val l: Long = str.toLong println(s"type=${l.getClass()}, val=${l}") // Shortへの変換 val s: Short = str.toShort println(s"type=${s.getClass()}, val=${s}") // Floatへの変換 val f: Float = str.toFloat println(s"type=${f.getClass()}, val=${f}") // Doubleへの変換 val d: Double = str.toDouble println(s"type=${d.getClass()}, val=${d}") // Byteへの変換 val b: Byte = str.toByte println(s"type=${b.getClass()}, val=${b}")

以下のように数値に変換されます。

type=int, val=123 type=long, val=123 type=short, val=123 type=float, val=123.0 type=double, val=123.0 type=byte, val=123

FloatDoubleは、浮動小数点型なので、以下のように小数点以下の値がある文字列も変換できます。

val str = "123.456" // Floatへの変換 val f: Float = str.toFloat println(s"type=${f.getClass()}, val=${f}") // Doubleへの変換 val d: Double = str.toDouble println(s"type=${d.getClass()}, val=${d}")

以下のように変換されます。

type=float, val=123.456 type=double, val=123.456

数値に変換できない文字列

小数点以下の値がある文字列をIntLongのような整数値に変換することはできません。 先程の文字列に対して、toIntを呼び出すと、java.lang.NumberFormatExceptionが、throwされます。

val str = "123.456" val i: Int = str.toInt
java.lang.NumberFormatException: For input string: "123.456" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.base/java.lang.Integer.parseInt(Integer.java:652) at java.base/java.lang.Short.parseShort(Short.java:120) at java.base/java.lang.Short.parseShort(Short.java:146) at scala.collection.StringOps$.toShort$extension(StringOps.scala:876) ... 36 elided

また、数値以外の文字が含まれる文字列を変換することもできません。 数値以外の文字が含まれる文字列に対して、toIntを呼び出すと、java.lang.NumberFormatExceptionが、throwされます。

val str = "non numeric" val i: Int = str.toInt
java.lang.NumberFormatException: For input string: "non numeric" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.base/java.lang.Integer.parseInt(Integer.java:652) at java.base/java.lang.Integer.parseInt(Integer.java:770) at scala.collection.StringOps$.toInt$extension(StringOps.scala:889) ... 36 elided

では、数値かどうかわからない文字列を、数値だったら数値に変換して、それ以外は、他の値としたい場合はどのようにすれば良いでしょうか?

このような場合は、各数値型に対してOptionを返す、以下のメソッドが用意されているので、それらを使います。

メソッド戻り値
InttoIntOptionOption[Int]
LongtoLongOptionOption[Long]
ShorttoShortOptionOption[Short]
FloattoFloatOptionOption[Float]
DoubletoDoubleOptionOption[Double]
BytetoByteOptionOption[Byte]

以下は、文字列を数値に変換できた場合は、その値を、数値に変換できなかった場合は、Intの最小値を返す例です。

def str2Int(value: String): Int = { value.toIntOption.getOrElse(Int.MinValue) }

上記の関数を数値に変換できる文字と数値に変換できない文字を指定して呼び出します。

// 数値に変換できた場合 val num = str2Int("123") println(s"type=${num.getClass()}, val=${num}") // 数値に変換できなかった場合 val min = str2Int("non num") println(s"type=${min.getClass()}, val=${min}")

以下のように出力されます。

type=int, val=123 type=int, val=-2147483648

StringOpsについて

これまで、文字列から数値に変換する場合は、Stringクラスのメソッドを呼び出して変換すると説明してきましたが、これは厳密には正しくはありません。

ScalaのStringクラスは、Javaのjava.lang.Stringクラスであり、java.lang.Stringには、数値に変換するメソッドは存在しません。

Javaの場合は、各数値型のクラスのvalueOfメソッドで、文字列から数値に変換します。

以下は、Javaの場合に文字列から数値に変換する例です。

val str = "123" val i: Int = java.lang.Integer.valueOf(str) println(s"type=${i.getClass()}, val=${i}")

以下のように出力されます。

type=int, val=123

では、Scalaはどのようにして、文字列を数値に変換するメソッドを呼び出しているのでしょうか?

前述の文字列を数値に変換するメソッドは、StringOpsクラスに定義されています。 文字列に対して、toIntを呼び出した場合は、StringOpsクラスのtoIntメソッドが呼び出されています。

StringOpsクラスの詳細は、Scalaの APIリファレンス を参照してください。

サイト内検索


カテゴリ「文字列処理」の記事

文字列をエスケープしたり復元したりする方法(Apache Commons Text) JavaとScalaのString/StringBuilder/StringBuffer使い分け事情 文字列を分割する方法(split・splitAt・linesIterator・linesWithSeparatorsメソッド) trimメソッドで文字列の前後の空白を除去する 文字列が一致するか比較する方法/大文字・小文字を区別せずに比較する方法 特定の文字の文字コード(コード・ポイント)を取得する replaceメソッドなど、文字列を置換する方法を紹介 文字列の先頭や末尾を、取得したり切り落としたりする方法 containsメソッドでStringに特定の文字列が含まれるか調べる方法 数値を文字列に変換する方法 stripメソッドで文字列の前後の全角空白を除去する 文字列を数値に変換するには?to○○メソッドと注意点について 文字列を辞書的に比較する方法/大文字・小文字を区別せずに比較する方法 文字列が特定の文字列で始まるか・終わるかを調べる方法 【getBytes&size】文字列のバイト長を取得する方法 substringでStringを切り取り、部分文字列を抽出する方法 StringOpsとWrappedStringの違いは? 文字列を連結するには?+演算子やString interpolationの使い方 文字列の大文字へ・小文字へ変換する方法 文字列を逆順にする方法 文字列の文字コード(文字セット)を変換する方法 文字列の長さを取得する方法:lengthとcodePointCountの使い分け 文字列をURLエンコード・デコードする方法 文字列が正規表現に合致するか調べる方法 この文字の位置はどこ?文字列のインデックスを取得する方法 文字列をバイト列に、またはバイト列を文字列に変換する方法

カテゴリ「文字列処理」の記事

文字列をエスケープしたり復元したりする方法(Apache Commons Text) JavaとScalaのString/StringBuilder/StringBuffer使い分け事情 文字列を分割する方法(split・splitAt・linesIterator・linesWithSeparatorsメソッド) trimメソッドで文字列の前後の空白を除去する 文字列が一致するか比較する方法/大文字・小文字を区別せずに比較する方法 特定の文字の文字コード(コード・ポイント)を取得する replaceメソッドなど、文字列を置換する方法を紹介 文字列の先頭や末尾を、取得したり切り落としたりする方法 containsメソッドでStringに特定の文字列が含まれるか調べる方法 数値を文字列に変換する方法 stripメソッドで文字列の前後の全角空白を除去する 文字列を数値に変換するには?to○○メソッドと注意点について 文字列を辞書的に比較する方法/大文字・小文字を区別せずに比較する方法 文字列が特定の文字列で始まるか・終わるかを調べる方法 【getBytes&size】文字列のバイト長を取得する方法 substringでStringを切り取り、部分文字列を抽出する方法 StringOpsとWrappedStringの違いは? 文字列を連結するには?+演算子やString interpolationの使い方 文字列の大文字へ・小文字へ変換する方法 文字列を逆順にする方法 文字列の文字コード(文字セット)を変換する方法 文字列の長さを取得する方法:lengthとcodePointCountの使い分け 文字列をURLエンコード・デコードする方法 文字列が正規表現に合致するか調べる方法 この文字の位置はどこ?文字列のインデックスを取得する方法 文字列をバイト列に、またはバイト列を文字列に変換する方法