1
votes

Comment extraire des nombres décimaux d'une chaîne en scala?

Extraction de nombres d'une chaîne avec des décimales:

replaceAll("\\D+","")) gives 18 string but not 1.8

Comment obtenir 1,8

 1.8 min


1 commentaires

Essayez "1.8 min" .split ('') .toList.flatMap (v => Essayez (v.toDouble) .toOption) . Il produira List (1.8)


3 Réponses :


2
votes

Votre expression régulière ne correspond qu'à des chiffres sans point, elle peut être corrigée comme suit:

scala> "1.8 min".split(' ').toList.flatMap(v => Try(v.toDouble).toOption)
res1: List[Double] = List(1.8)

\\.? signifie qu'il peut ou non y avoir un point

Vous pouvez également analyser sans utiliser de regexp:

scala> "1.8 min".replaceAll("\\D+\\.?\\D+","")
res0: String = 1.8


0 commentaires

1
votes

Vous pouvez également utiliser Regex avec une correspondance de modèle

def findDecimal(s: String) ={

  import scala.util.matching.Regex
  val decimalPattern:Regex = "\\d*\\.?\\d*".r

  decimalPattern.findFirstMatchIn(s) match {
    case Some(x) => x
    case None => None
  }
}

println(findDecimal("1.8 min"))
//1.8


1 commentaires

Il produit le résultat de type Object . Pas de type sûr



3
votes

Votre Regex supprime simplement tous les caractères non numériques. Cependant, la représentation décimale d'un nombre n'est pas une série de chiffres, c'est une série de chiffres suivis d'un séparateur décimal (. aux États-Unis, , en Allemagne, et ainsi de suite) suivi d'une autre série de chiffres. Il peut également y avoir des milliers de séparateurs là-dedans (, aux États-Unis, . ou un espace insécable mince en Allemagne, ' dans un autre pays, et ainsi de suite). De plus, la partie décimale peut être facultative.

Vous devez décider combien de ces complexités vous voulez gérer.

Allons-y pour une partie intermédiaire: partie décimale facultative, pas de séparateurs de milliers: p>

private final val decimal = """(?<value>\d+[.,]?\d*)""".r.unanchored

"1,8 min" match { 
  case decimal(value) => BigDecimal(value.replace(",", "."))
  case _              => BigDecimal(0)
}


0 commentaires