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
3 Réponses :
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
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
Il produit le résultat de type Object . Pas de type sûr
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)
}
Essayez
"1.8 min" .split ('') .toList.flatMap (v => Essayez (v.toDouble) .toOption). Il produiraList (1.8)