scala - ограниченный способ преобразования строки в число - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть строковая переменная, которую нужно разобрать в двойной

Код :

val myString = "9d"
myString.toDouble // produces "9.0" which i don't want. this should throws an error

Как мне сделать так, чтобы моя строка интерпретировалась буквально такчто оно выдает исключение?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Так что, очевидно, Java java.lang.Double#parseDouble способен анализировать все виды строк, например, NaN, Infinity и др.

Ответ на вашу проблему, кажется, BigDecimal(myString).toDouble

Из любопытства вот, что три различных подхода возвращают для различных типов входных строк:

  def main(args: Array[String]): Unit = {
    val strings = Seq("Infinity", "NaN", "9.0d", "9d", "9f", "9.0", "9.1", "1.4e14")
    val parsers = Seq(
      ("Double", (s: String) => s.toDouble),
      ("BigDecimal", (s: String) => BigDecimal(s).toDouble),
      ("NumberFormat", (s: String) => NumberFormat.getNumberInstance.parse(s).doubleValue()),
    )

    for (string <- strings) {
      println(s"\n------------- $string ------------")
      for ((name, parser) <- parsers) {
        val result = Try(parser(string)) match {
          case scala.util.Success(value) => value
          case scala.util.Failure(ex) => ex.toString
        }
        println(name.reverse.padTo(20, " ").reverse.mkString + " -> " + result)
      }

    }
  }

Результат:

------------- Infinity ------------
              Double -> Infinity
          BigDecimal -> java.lang.NumberFormatException
        NumberFormat -> java.text.ParseException: Unparseable number: "Infinity"

------------- NaN ------------
              Double -> NaN
          BigDecimal -> java.lang.NumberFormatException
        NumberFormat -> java.text.ParseException: Unparseable number: "NaN"

------------- 9.0d ------------
              Double -> 9.0
          BigDecimal -> java.lang.NumberFormatException
        NumberFormat -> 9.0

------------- 9d ------------
              Double -> 9.0
          BigDecimal -> java.lang.NumberFormatException
        NumberFormat -> 9.0

------------- 9f ------------
              Double -> 9.0
          BigDecimal -> java.lang.NumberFormatException
        NumberFormat -> 9.0

------------- 9.0 ------------
              Double -> 9.0
          BigDecimal -> 9.0
        NumberFormat -> 9.0

------------- 9.1 ------------
              Double -> 9.1
          BigDecimal -> 9.1
        NumberFormat -> 9.1

------------- 1.4e14 ------------
              Double -> 1.4E14
          BigDecimal -> 1.4E14
        NumberFormat -> 1.4
0 голосов
/ 22 ноября 2018

Я нашел решение с scalaz:

import scalaz.Scalaz._

println("34b".parseDouble) // Failure(java.lang.NumberFormatException: For input string: "34b")

println("34.4".parseDouble) // Success(34.4)
...