J'ai une chaîne contenant ce qui suit: "Est-ce que c'était votre chemin, 11,95 l'histoire de l'Écosse, 14.50, apprenez le calcul en une journée, 29.95" Y a-t-il un moyen d'obtenir les doubles de cette chaîne? p>
8 Réponses :
Si vous êtes intéressé par tous les numéros avec des chiffres, une période unique et plus de chiffres, vous souhaitez utiliser des expressions régulières. Tels que \ s \ d *. \ D \ s code>, indiquant un espace, suivi de chiffres, une période, plus de chiffres et finis avec un espace. P>
Mieux vaut utiliser \ B au lieu de \ S dans ce cas. \ b signifie "le mot bord et correspond aux espaces, comas, points, etc.
Utilisez des expressions régulières pour extraire des doubles, puis double.Parsedouble () à analyser:
En fait, cette réponse ne fonctionne pas pour des doubles à moins d'avoir un point décimal dans i> eux. Voir ma réponse, avec la sortie de test, pour une solution qui fait
Cette regex échoue sur des nombres négatifs et des nombres naturels de nombres.
Utilisez un module d'expressions régulières (regex [p]) de votre langue préférée, construisez un matcheur pour le modèle \ d + \. \ d + code>, appliquez la correspondance de la chaîne d'entrée et vous obtenez la correspondance. Substrings comme groupes de capture. P>
La question est étiquetée comme Java.
String text = "Did It Your Way, 11.95 The History of Scotland, 14.50, Learn Calculus in One Day, 29.95";
List<Double> foundDoubles = Lists.newLinkedList();
String regularExpressionForDouble = "((\\d)+(\\.(\\d)+)?)";
Matcher matcher = Pattern.compile(regularExpressionForDouble).matcher(text);
while (matcher.find()) {
String doubleAsString = matcher.group();
Double foundDouble = Double.valueOf(doubleAsString);
foundDoubles.add(foundDouble);
}
System.out.println(foundDoubles);
Ceci trouve des doubles, des nombres entiers (avec et sans point décimal) et des fractions (un point décimal de premier plan): sortie: p>
Notez simplement que Parsedouble peut toujours jeter une exception qui devrait être attrapée. Imo évitant tout ce genre de choses et juste à l'aide d'un scanner.nextDouble () est plus simple
Votre look-avance disqualifie les en-têtes de section (par exemple, 3.2.4 code>) et pourtant votre groupe de capture se répète, Faire échouer .
Java fournit scanner qui vous permet de numériser un String (ou tout flux d'entrée) et analyser les types primitifs et les jetons de chaîne à l'aide d'expressions régulières.
Il serait probablement préférable d'utiliser cela plutôt que d'écrire votre propre regex, purement pour des raisons de maintenance. P>
Scanner sc = new Scanner(yourString);
double price1 = sc.nextDouble(),
price2 = sc.nextDouble(),
price3 = sc.nextDouble();
Voici comment je l'ai fait quand j'avais été commis d'un utilisateur et je ne savais pas ce que cela ressemblerait à:
Utiliser le scanner (exemple de TutorialPoint).
Expressions de regex suggéré ci-dessus échoue sur cet exemple: "hi! -4 + 3.0 = -1.0 true" code> détecte {3.0, 1,0} code>. String s = ""Hello World! -4 + 3.0 = -1.0 true"";
// create a new scanner with the specified String Object
Scanner scanner = new Scanner(s);
// use US locale to be able to identify doubles in the string
scanner.useLocale(Locale.US);
// find the next double token and print it
// loop for the whole scanner
while (scanner.hasNext()) {
// if the next is a double, print found and the double
if (scanner.hasNextDouble()) {
System.out.println("Found :" + scanner.nextDouble());
}
// if a double is not found, print "Not Found" and the token
System.out.println("Not Found :" + scanner.next());
}
// close the scanner
scanner.close();
}