So konvertieren Sie eine Beliebige Anzahl zu Verdoppeln?
Muss ich tun, einige raw-Daten analysieren und so bin ich gezwungen, die Arbeit mit Any
geben.
Wenn die Daten, die ich lese, ist in jedem numerischen format (Int
/Double
/Long
/...) muss ich es konvertieren zu Double
anderes (zB. String
) Ich brauche lassen Sie es leer.
Dies ist, was ich kam mit:
def extractDouble(expectedNumber: Any): Option[Double] = expectedNumber match {
case i: Int => Some(i.toDouble)
case l: Long => Some(l.toDouble)
case d: Double => Some(d)
case _ => None
}
Dies natürlich nicht schauen, auch anständig. Gibt es eine bessere Möglichkeit, um sich mit diesem in Scala?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sobald Sie verloren Ihre Typinformationen zur compile-Zeit, wie es passiert in Ihrem Fall, da Sie Ihre Eingabe-Typ
Any
als Teil Ihrer Anforderungen, es gibt keine Optionen mehr, als die InspektionexpectedNumber
zur Laufzeit mitisInstanceOf
.Ist maskiert durch die Umsetzung von Art pattern-matching, die Sie tun, in Ihrer vorgeschlagenen Lösung. Und ich denke, dass ist die beste Lösung in deinem Fall.
Gibt es jedoch eine alternative, die ist mit
Try
über, und verwandelt es in eineOption
. e.g:Das ist eine schmutzige Lösung, die in so vieler Hinsicht (nicht effizient an alle, mit Ausnahmen von control flow, ...), die ich würde definitiv verwenden Sie Ihre erste Ansatz
Sicherlich ist es möglich, wie in diese Antwort:
Verwenden
java.lang.Number
- passend zu Ihrem Fall geben.Beachten Sie, dass dies funktioniert auch für Instanzen von
BigDecimal
undBigInteger
werden esscala.math.BigDecimal
oderjava.math.BigDecimal
.Scala ist eine Zeichenfolge, die als Doppel-parseable
Any
parameter, und auch das funktioniert nur, wenn Sie eineString
(das ist natürlich leicht zu erreichen, aber digresses aus dem ursprünglichen problem).Ich war mit der OP ist die Lösung für eine Weile. Aber nach der Begegnung einige leicht beschädigte Daten-Eingabe, die ich später geändert, um eine Kombination von OP ' s-Lösung und die
Try
Lösung.den
case s:String
Linie kann sparen Sie ein bisschen Debuggen und Kopf kratzen hinunter die Linie, wenn Sie den Umgang mit großen und potentiell chaotisch DatenAb
Scala 2.13
, wir könnten das neue(String::toDoubleOption
nach der UmwandlungexpectedNumber: Any
zuString
:Zum Beispiel: