2016-10-13 7 views
2

Я пытаюсь использовать класс сканера Java для сканирования в значениях double и int, разделенных запятыми.Java - Сканирование значений двойной и двойной запятой

Следующие Scanner input = new Scanner(System.in).useDelimiter("\\D"); могут сканировать только значения int, разделенные ,. например input = 1000,2,3

Как сканировать в значениях double и int, разделенных ,, например. input = 1000.00,3.25,5 или 100.00,2,3.5?

Я попытался следующие, но они, кажется, не работают:

Scanner input = new Scanner(System.in).useDelimiter(","); 
Scanner input = new Scanner(System.in).useDelimiter("\\,"); 
Scanner input = new Scanner(System.in).useDelimiter("[,]"); 

Используя эти подвисает код. После ввода примера ввода System.out.println не выполнялся для отсканированных переменных.

Ниже мой пример кода:

import java.io.*; 
import java.util.Scanner; 

public class Solution { 
    public static void main(String args[]) throws Exception { 
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
    System.out.print("Enter your values: "); 
    // Scanner input = new Scanner(System.in).useDelimiter("\\D"); 
    Scanner input = new Scanner(System.in).useDelimiter(","); 
    // Scanner input = new Scanner(System.in).useDelimiter("\\,"); 
    // Scanner input = new Scanner(System.in).useDelimiter("[,]"); 

    double investmentAmount = input.nextDouble(); 
    double monthlyInterestRate = input.nextDouble()/100/12; 
    double numberOfYears = input.nextDouble(); 
    double duration = numberOfYears * 12; 

    double futureInvestmentValue = investmentAmount * Math.pow((1 + monthlyInterestRate), duration); 
    System.out.println(investmentAmount); 
    System.out.println(monthlyInterestRate); 
    System.out.println(numberOfYears); 
    System.out.println(duration); 
    System.out.println("Accumulated value is " + futureInvestmentValue); 
    } 
} 

Решение найдено

Обновление строки сканера к следующему, кажется, зафиксировали это:

Scanner input = new Scanner(System.in).useDelimiter("[,\n]"); 
+1

Ваш код работает хорошо для меня. Каков ваш ввод и вывод? – 4castle

+0

@ 4castle, мой ввод '1000.00.3.25,1' все на одной строке как один вход. Нет выхода, поскольку код висит после ввода ввода. Я на OpenJDK Java 7 – j7an

+0

@ eduardo-dennis Я бы сделал, если код работает. Он по-прежнему зависает с 'input.nextLine();' как то, как вы закодировали его после последнего nextDouble() и ввели '1000.00.3.25,1' в качестве ввода все в одной строке. – j7an

ответ

1

Скорее всего у вас есть Locale и ваш Scanner пытается разобрать парные разряды с запятой, но вы устанавливаете запятую как сканер. Попробуйте следующее решение:

Scanner input = new Scanner(System.in) 
     .useDelimiter(",") 
     .useLocale(Locale.ENGLISH); 

Это будет устанавливать разделитель разметки на две части, и ваши двойные запятые должны работать нормально.

Обязательно поместите запятую в конце ввода, чтобы проанализировать последнее значение, например. 1000.00,3.25,5, (может быть, это даже основная причина того, что ваши входы не работают)

+0

Спасибо, что понял это. Наличие ввода с запятой. – j7an

0

Проблема, с которой вы столкнулись, состоит в том, что nextDouble() не использует последнюю строку. Попробуйте добавить input.nextLine() в конце, он должен работать как ожидалось.

/* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
System.out.print("Enter your values: "); 
Scanner input = new Scanner(System.in).useDelimiter(","); 

double investmentAmount = input.nextDouble(); 
double monthlyInterestRate = input.nextDouble()/100/12; 
double numberOfYears = input.nextDouble(); 
input.nextLine(); 
double duration = numberOfYears * 12; 

double futureInvestmentValue = investmentAmount * Math.pow((1 + monthlyInterestRate), duration); 
System.out.println(investmentAmount); 
System.out.println(monthlyInterestRate); 
System.out.println(numberOfYears); 
System.out.println(duration); 
System.out.println("Accumulated value is " + futureInvestmentValue); 

Scanner is skipping nextLine() after using next(), nextInt() or other nextFoo() methods

+0

Да, я должен принять все входные данные в Интернете. Извините за то, что я не понимаю. – j7an

+0

Я только что понял, что вы закончили свой ввод запятой. Я пробовал, и это сработало. Если я не закончил ввод запятой. Это не сработает. – j7an

+0

@ j7an проверить мои изменения. Вы можете добавить input.nextLine(), чтобы исправить эту проблему. –