2011-07-18 2 views
9

У меня есть строка, содержащая следующее: «Сделал это по-своему», 11.95 «История Шотландии», 14.50, «Изучение исчисления за один день», 29.95 « есть ли способ получить двойники из этой строки?Получение двойника из строки

+3

Это домашнее задание, не так ли? –

ответ

1

Если вас интересуют любые цифры с цифрами, одним периодом и более цифрами, вы хотите использовать регулярные выражения. Например, \s\d*.\d\s, указывая пробел, затем цифры, период, больше цифр и заканчивается пробелом.

+0

Не могли бы вы показать мне пример, пожалуйста? – Edward

+0

лучше использовать \ b вместо \ s в этом случае. \ b означает «край слова и совпадения пробелов, комов, точек и т. д. – AlexR

+0

см. пример, который я опубликовал. – AlexR

14

Используйте регулярные выражения для извлечения двойников, то Double.parseDouble() для анализа: ([р] регулярного выражения) модуля

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

Собственно, этот ответ не работает для удвоений, если у них нет десятичной точки * внутри *. См. мой ответ, с тестовый выход, для решения, которое делает – Bohemian

+0

, он отлично работает! –

+0

Это регулярное выражение выходит из строя на отрицательных числах и на натуральных числах чисел. – Stepan

-2

использовать регулярные выражения вашего любимого языка, построить Искатель для шаблона \d+\.\d+, примените совпадение для входной строки, и вы получите соответствующие подстроки как группы захвата.

+1

Вопрос отмечен как 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

Это находит двойников, целые числа (с и без десятичной точки) и фракции (ведущей десятичной запятой):

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); 
    } 
} 

Выход:

5.0 
11.95 
0.25 
3.0 
+0

Просто обратите внимание, что parseDouble все равно может выдать исключение, которое должно быть уловлено. избегая всего этого, и просто используя Scanner.nextDouble() проще – Voo

+0

. Ваш взгляд на будущее дисквалифицирует заголовки разделов (например, '3.2.4'), и все же ваша группа захвата повторно разрешает их, [что делает невозможным] (http: // www.ideone.com/5nARX). –

8

Java предоставляет Scanner который позволяет сканировать String (или любой входной поток) и анализировать примитивные типы и токены с использованием регулярных выражений.

Скорее всего, предпочтительнее использовать это вместо написания собственного регулярного выражения, чисто по соображениям технического обслуживания.

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

Вот как я сделал это, когда я получал данные от пользователя и не знал, что это будет выглядеть так:

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

Использование сканера (например, из TutorialPoint). Выражения выражения, предложенные выше, не могут быть выполнены в этом примере: "Hi! -4 + 3.0 = -1.0 true" обнаруживает {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(); 
    } 
Смежные вопросы