Scala, przyjmowanie liczb w trybie konsolowym


(matiit) #1

Na pierwszą myśl napisałem to tak:

var n: Int = 0

try {

            n = scala.io.Source.stdin.getLine(0).toInt

        } catch {

            case nfe: java.lang.NumberFormatException => println("Musisz podać liczbę...")

            case e: Exception => println("Nieznany błąd")

        }

Widać że wychodzi to trochę długo (jeszcze nie dodałem pętli, żeby jeszcze raz prosiło w razie błędu).

Nie da się trochę szybciej i ładniej?


([alex]) #2

http://lampsvn.epfl.ch/trac/scala/brows ... sole.scala

jest tam readInt();


(matiit) #3

[alex], Zauważ że to praktycznie chroni tylko przed pustym stringiem.

Metoda toInt wykonana na Stringu który jest literami zwraca właśnie NumberFormatException

Czyli to i tak nie pomaga jeśli chcę wyłapać, że ktoś wpisał litery.

Jako że scala nie ma break i continue, poradziłem sobie rekurencją:

def myReadInt(): Int = {

    var n: Int = 0

        try{

            n = readInt

        } catch {

            case nfe: java.lang.NumberFormatException => 

                println("Przyjmuję tylko liczby!");

                n = myReadInt;

            case e: Exception => 

                println("Nieznany błąd");

                n = myReadInt;

        }

        return n

}

([alex]) #4

No to skorzystaj ze scaner'a javy.

masz tam funkcję:

hasNextInt();

oraz

NextInt();