2011-07-18 13 views
9

tengo una cadena que contiene lo siguiente: "Did It Your Way, 11.95 The History of Scotland, 14.50, Aprende Cálculo en un día, 29.95" ¿Hay alguna manera de obtener los dobles? de esta cadena?Cómo obtener un doble de una cadena

+3

Esto es tarea, ¿o no? –

Respuesta

1

Si le interesan todos los números con dígitos, un solo punto y más dígitos, desea usar expresiones regulares. Tal como \s\d*.\d\s, que indica un espacio, seguido de dígitos, un punto, más dígitos y terminado con un espacio.

+0

¿podría mostrarme un ejemplo, por favor? – Edward

+0

es mejor usar \ b en lugar de \ s en este caso. \ b significa "el borde de la palabra y coincide con espacios, comas, puntos, etc. – AlexR

+0

vea el ejemplo que publiqué. – AlexR

14

utilizar expresiones regulares para extraer dobles, a continuación, Double.parseDouble() para analizar:

Pattern p = Pattern.compile("(\\d+(?:\\.\\d+))"); 
Matcher m = p.matcher(str); 
while(m.find()) { 
    double d = Double.parseDouble(m.group(1)); 
    System.out.println(d); 
} 
+0

En realidad, esta respuesta no funciona en dobles a menos que tengan un punto decimal * dentro de * ellos. Vea mi respuesta, con salida de prueba, para una solución que hace – Bohemian

+0

funciona perfectamente! –

+0

Esta expresión regular falla en números negativos y en números números naturales – Stepan

-2

utilizar expresiones regulares ([p] de expresiones regulares) de módulo de su idioma favorito, la construcción de un Matcher para el patrón \d+\.\d+, aplique el matcher para la cadena de entrada y obtendrá las subcadenas coincidentes como grupos de captura.

+1

La pregunta está etiquetada como Java. –

0
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); 
1

Esto encuentra dobles, números enteros (con y sin un punto decimal), y las fracciones (un punto decimal líder):

public static void main(String[] args) 
{ 
    String str = "This is whole 5, and that is double 11.95, now a fraction .25 and finally another whole 3. with a trailing dot!"; 
    Matcher m = Pattern.compile("(?!=\\d\\.\\d\\.)([\\d.]+)").matcher(str); 
    while (m.find()) 
    { 
     double d = Double.parseDouble(m.group(1)); 
     System.out.println(d); 
    } 
} 

Salida:

5.0 
11.95 
0.25 
3.0 
+0

Solo tenga en cuenta que parseDouble todavía puede lanzar una excepción que debe ser atrapada. evitar todo eso y simplemente usar Scanner.nextDouble() es más simple – Voo

+0

Su anticipación descalifica los títulos de las secciones (por ejemplo, '3.2.4') y, sin embargo, su grupo de captura los vuelve a permitir, [lo hace fallar] (http: // www.ideone.com/5nARX). –

8

Java proporciona Scanner que le permite escanear un String (o cualquier flujo de entrada) y analizar tipos primitivos y tokens de cadena utilizando expresiones regulares.

Probablemente sea preferible usar esto en lugar de escribir su propia expresión regular, solo por razones de mantenimiento.

Scanner sc = new Scanner(yourString); 
double price1 = sc.nextDouble(), 
     price2 = sc.nextDouble(), 
     price3 = sc.nextDouble(); 
0

Aquí es cómo lo hice cuando estaba recibiendo entrada de un usuario y no sabía lo que se vería así:

Vector<Double> foundDoubles = new Vector<Double>(); 

    Scanner reader = new Scanner(System.in); 
    System.out.println("Ask for input: "); 

    for(int i = 0; i < accounts.size(); i++){ 
     foundDoubles.add(reader.nextDouble()); 
    } 
1

Uso del escáner (ejemplo de TutorialPoint). Las expresiones regex sugeridas anteriormente fallan en este ejemplo: "Hi! -4 + 3.0 = -1.0 true" detecta {3.0, 1,0}.

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(); 
    } 
Cuestiones relacionadas