[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
Scalaで文字列を数値に変換する方法をご紹介します。
変換できる数値型
Scalaでは、文字列を以下の数値型に変換することができます。
- Int
- Long
- Short
- Double
- Float
- Byte
数値に変換するメソッド
String
クラスに、以下のように各数値型に変換するメソッドが用意されていますので、それらのメソッドを呼び出して数値に変換します。
型 | メソッド | 戻り値 |
---|---|---|
Int | toInt | Int |
Long | toLong | Long |
Short | toShort | Short |
Float | toFloat | Float |
Double | toDouble | Double |
Byte | toByte | Byte |
それでは、文字列を数値型に変換してみます。
// 変換する文字列 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
Float
とDouble
は、浮動小数点型なので、以下のように小数点以下の値がある文字列も変換できます。
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
数値に変換できない文字列
小数点以下の値がある文字列をInt
やLong
のような整数値に変換することはできません。
先程の文字列に対して、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
を返す、以下のメソッドが用意されているので、それらを使います。
型 | メソッド | 戻り値 |
---|---|---|
Int | toIntOption | Option[Int] |
Long | toLongOption | Option[Long] |
Short | toShortOption | Option[Short] |
Float | toFloatOption | Option[Float] |
Double | toDoubleOption | Option[Double] |
Byte | toByteOption | Option[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リファレンス
を参照してください。