2017-06-24 1 views

Antwort

0

Anstatt den Typ zu überprüfen, würde ich den Eingang direkt verwenden. Versuchen:

val intput = scala.io.StdIn.readLine() 

if (Try(input.toInt).isSuccess) ... // It is an integer 
else if (Try(input.toFloat).isSuccess) ... // It is a float 
else if (Try(input.toDouble).isSuccess) ... // It is a double 
else ... // No need to convert to string 
0

Sie können scala ‚s stärkste api matchcase für diesen Fall als

scala>  def findDataType(x: Any) = x match { 
    |  case x : String => println("String identified") 
    |  case x : Int => println("Integer identified") 
    |  case x : Float => println("Float identified") 
    |  case x : Double => println("Double identified") 
    |  case _ => println("DataType not identified") 
    |  } 
findDataType: (x: Any)Unit 

scala> findDataType("abcd") 
String identified 

scala> findDataType(1) 
Integer identified 

scala> findDataType(1.0) 
Double identified 

scala> findDataType(1D) 
Double identified 

scala> findDataType(1f) 
Float identified 

scala> findDataType('c') 
DataType not identified 

verwenden können, lesen wir in der Konsole und gehen auf die obige Funktion als

scala> findDataType(scala.io.StdIn.readInt()) 
Integer identified 

scala> findDataType(scala.io.StdIn.readLine()) 
String identified 

scala> findDataType(scala.io.StdIn.readFloat()) 
Float identified 

Bearbeitet

können Sie regex Muster verwenden, wie unten (I nur Integer verwendet habe und Schwimmer)

scala> val INT_PATTERN: String = "^[-+]?[0-9]*$" 
INT_PATTERN: String = ^[-+]?[0-9]*$ 

scala> val FLOAT_PATTERN: String = "^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$" 
FLOAT_PATTERN: String = ^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$ 

und die Funktion als

scala> def findDataType(value: Any) = { 
    | if(value.toString.matches(INT_PATTERN)) println("Integer identified") 
    | else if(value.toString.matches(FLOAT_PATTERN)) println("Float identified") 
    | else println("String identified") 
    | } 
findDataType: (value: Any)Unit 

Aufruf die Funktion mit scala.io.StdIn.readLine() definieren, wie unten dem genauen Datentyp würde

scala> findDataType(scala.io.StdIn.readLine()) // 2 is entered 
Integer identified 

scala> findDataType(scala.io.StdIn.readLine()) //ab is entered 
String identified 

scala> findDataType(scala.io.StdIn.readLine()) // 2.1 is entered 
Float identified 

Dies kann für andere Datentypen auch getan werden.

+0

Das würde nicht funktionieren, da der Typ des Wertes, der von der Konsole gelesen wird, bereits ein String ist. Die Frage, ob der Datentyp aus der von der Konsole gelesenen Zeichenfolge ermittelt werden soll. –

+0

@VivekKothari Nicht alles, was Sie von Console lesen, ist String, es hängt davon ab, wie Sie es lesen. zum Beispiel, wenn Sie wie scala.io.StdIn.readLine() lesen, dann ist es eine Zeichenfolge, aber wenn Sie lesen wie val intput = scala.io.StdIn.readInt() dann ist es eine ganze Zahl. Ich hoffe, du hast mich erwischt. Dann können Sie das val an die obige Funktion übergeben, um den Datentyp zu erhalten. :) –

+0

Einverstanden. Die Frage ist nicht beschreibend genug, um zu veranschaulichen, wie die Daten gelesen werden. Wenn @sumit die readInt-Methode readFloat aufrufen würde, warum sollten Sie den Typ überhaupt ermitteln? Es ist schon von der gewünschten Art :) –

Verwandte Themen