Java - 扫描逗号分隔的双精度和整数值

4

我想使用Java的Scanner类来扫描由逗号分隔的double和int值。

以下Scanner input = new Scanner(System.in).useDelimiter("\\D");只能扫描由,分隔的int值,例如input = 1000,2,3

如何扫描由,分隔的double和int值,例如input = 1000.00,3.25,5100.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
@4castle,我的输入是1000.00,3.25,1,全部在一行作为一个输入。代码没有输出,因为在输入后代码停止运行了。我使用的是OpenJDK Java 7。 - j7an
@eduardo-dennis 如果代码能够正常工作,我就会这样做。但是,在您编写的最后一个nextDouble()之后,使用input.nextLine();仍然会挂起,并且在一行上输入1000.00,3.25,1作为输入。 - j7an
@j7an 复制并粘贴我的完整代码,它会像预期的那样工作。 - Eduardo Dennis
@eduardo-dennis 我已经完成了 - j7an
2个回答

4

很可能您遇到了Locale问题,您的Scanner试图解析逗号分隔的双精度浮点数,但您将逗号设置为扫描器分隔符。请尝试以下解决方案:

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

这将把双精度数的分隔符设置为点,这样你的以逗号分隔的双精度数就可以正常工作了。
请确保在输入的末尾放置逗号以解析最后一个值,例如:1000.00,3.25,5,(可能是你的输入不起作用的主要原因)。

感谢您解决了这个问题。以逗号结尾的输入有效。 - 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);

在使用next()、nextInt()或其他nextFoo()方法后,Scanner跳过了nextLine()


是的,我必须接受在线上的所有输入。抱歉没有表达清楚。 - j7an
我刚意识到你的输入以逗号结尾。我尝试了一下,结果奏效了。如果我不以逗号结束输入,它就无法运行。 - j7an
@j7an,请检查我的编辑。你可以添加一个input.nextLine()来解决这个问题。 - Eduardo Dennis
我在最后一个nextDouble()下面添加了String x = input.nextLine();,但它仍然卡住了。问题在于useDelimiter需要将逗号和回车符"[,\n]"都作为分隔符。 - j7an
我添加了代码,它能够在不需要最后一个逗号的情况下正常工作。 - Eduardo Dennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接