Paresh Nagore
Paresh Nagore

Reputation: 486

Extract numbers from String Array

I have a Array of Strings

scala> tokens
res34: Array[String] = Array(The, value, of, your, profile, is, 234.2., You, have, potential, to, gain, 8.3, more.)

Here each of comma separated value is a String.
I want to extract numbers from this i.e. my output should be result = (234.2, 8.3) & it should be mutable so that I can read from another array and append values

What data structure should I use to achieve this?

Upvotes: 1

Views: 1231

Answers (4)

dkolmakov
dkolmakov

Reputation: 667

In Scala there is a syntactic sugar to compose map and filter called for comprehension. Below is a version of regex approach based on for:

val regex = ".*\\d+\\.?\\d+.*"
val nums = for {
    str <- tokens if str.matches(regex)
    numStr = str.trim.split("\\W+").mkString(".")
} yield numStr.toDouble

It gives the desired output:

nums: Array[Double] = Array(234.2, 8.3)

Upvotes: 1

igx
igx

Reputation: 4231

Simply filter your array with regex

val numericRegex: String = "\\d+\\.\\d+"
tokens filter(_.matches(numericRegex))

Note that the 6'th value 232.2. is not a number. you must remove the last dot "." so it will be 232.2

If values include spaces than you have to trim them

tokens map (_.trim) filter (_.matches(numericRegex))
res28: Array[String] = Array(234.2, 8.3)

Upvotes: 3

elm
elm

Reputation: 20415

Consider

import scala.util._
tokens.flatMap(s => Try( s.split("\\W+").mkString(".").toDouble ).toOption)

where we tokenize further each array string into words and append them by a dot (this ought to strip out for instance trailing dots); we convert the resulting tokens into doubles whenever possible (note Try toOption will deliver None for failed conversions). With flatMap we keep only successful conversion.

Upvotes: 4

Ibrahim
Ibrahim

Reputation: 6098

With Regex, you can use this code to catch all the numbers:

\d+\.?\d+

Demo: https://regex101.com/r/pZomjn/1

Upvotes: 1

Related Questions