Skip to content

Commit

Permalink
Merge pull request #190 from typelevel/temperature-regex
Browse files Browse the repository at this point in the history
don't parse multiple degree symbols and be more flexible in whitespace when parsing temperature
  • Loading branch information
cquiroz committed Feb 8, 2017
2 parents 199b199 + 6affa29 commit e06ad93
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 14 deletions.
22 changes: 8 additions & 14 deletions shared/src/main/scala/squants/thermal/Temperature.scala
Original file line number Diff line number Diff line change
Expand Up @@ -141,21 +141,15 @@ object Temperature extends Dimension[Temperature] with BaseDimension {
def apply[A](n: A, scale: TemperatureScale)(implicit num: Numeric[A]) = new Temperature(num.toDouble(n), scale)

def apply(s: String): Try[Temperature] = {
val regex = "([-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?)[ °]*(f|F|c|C|k|K|r|R)".r
val regex = "([-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?)* *°? *(f|F|c|C|k|K|r|R)".r
s match {
case regex(value, Fahrenheit.symbol) Success(Fahrenheit(value.toDouble))
case regex(value, "f") Success(Fahrenheit(value.toDouble))
case regex(value, "F") Success(Fahrenheit(value.toDouble))
case regex(value, Celsius.symbol) Success(Celsius(value.toDouble))
case regex(value, "c") Success(Celsius(value.toDouble))
case regex(value, "C") Success(Celsius(value.toDouble))
case regex(value, Kelvin.symbol) Success(Kelvin(value.toDouble))
case regex(value, "k") Success(Kelvin(value.toDouble))
case regex(value, "K") Success(Kelvin(value.toDouble))
case regex(value, Rankine.symbol) Success(Rankine(value.toDouble))
case regex(value, "r") Success(Rankine(value.toDouble))
case regex(value, "R") Success(Rankine(value.toDouble))
case _ Failure(QuantityParseException("Unable to parse Temperature", s))
case regex(value, unit) => unit match {
case "f" | "F" => Success(Fahrenheit(value.toDouble))
case "c" | "C" => Success(Celsius(value.toDouble))
case "k" | "K" => Success(Kelvin(value.toDouble))
case "r" | "R" => Success(Rankine(value.toDouble))
}
case _ => Failure(QuantityParseException("Unable to parse Temperature", s))
}
}

Expand Down
12 changes: 12 additions & 0 deletions shared/src/test/scala/squants/thermal/TemperatureSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,18 @@ class TemperatureSpec extends FlatSpec with Matchers {
Temperature("ZZ F").failed.get should be(QuantityParseException("Unable to parse Temperature", "ZZ F"))
}

they should "be flexible in parsing strings with regard to degree symbol and whitespace" in {
Temperature("10.22 f").get should be (Fahrenheit(10.22))
Temperature("10.22 °f").get should be (Fahrenheit(10.22))
Temperature("10.22 °f").get should be (Fahrenheit(10.22))
Temperature("10.22 ° f").get should be (Fahrenheit(10.22))
Temperature("10.22 ° f").get should be (Fahrenheit(10.22))
Temperature("10.22 ° f").get should be (Fahrenheit(10.22))
Temperature("10.22°f").get should be (Fahrenheit(10.22))

Temperature("10.22°°f").failed.get should be (QuantityParseException("Unable to parse Temperature", "10.22°°f"))
}

they should "properly convert to all supported Units of Measure (Scale)" in {
val x = Kelvin(0)
x.toKelvinScale should be(0)
Expand Down

0 comments on commit e06ad93

Please sign in to comment.