【问题标题】:Check String is in a range of numbers Java检查字符串是否在一个数字范围内 Java
【发布时间】:2017-05-04 19:44:36
【问题描述】:

尝试设计一个简单的彩票程序。除了检查输入的数字是否在 1 到 59 之间之外,一切正常。

练习说数字必须存储在String 变量中。

所以

if(num<0 || num>59) //wont work for me

尝试制作另一个变量

int numConverted = Integer.parseInt(num)

虽然我们还没有在课堂上将String 转换为int,所以我认为这不是预期的结果。无论如何尝试这种方式都会感到困惑,所以这可能是错误的。

这是我目前的代码。

{
    Scanner scan = new Scanner(System.in);

    String num=""; //num variable is empty untill user inputs numbers

    for(int i =0; i<6; i++) 
    {
        System.out.println("Enter your number between 1-59");
        num = num +" "+ scan.nextLine(); 
    }

    System.out.println("Ticket printed £2. Your numbers are " + num);
}

【问题讨论】:

  • String不是数值,也不能当做一个。
  • 为什么不使用 Scanner 的nextInt() 方法来填充原始数组(int[] numbers = new int[5])呢?
  • 您需要将其转换为数字才能执行数字比较。给您使用int 变量的方法一个机会!
  • ...实际上您需要nextInt() 后跟nextLine 才能使用EOL(行尾)字符。
  • 坦率地说,Integer.parseInt 正好适合这种情况。

标签: java string int


【解决方案1】:

在您发布的代码中,很明显您希望用户提供 6 个特定的数值。这些值附加到名为 num 的字符串变量(空格分隔)。您显然需要在这里做几件事:

1) 确保用户提供的值确实是数值;

2) 确保提供的数值在彩票本身的最小和最大范围内(您所说的是:1 到 59);

3) 确保尚未提供用户输入的号码。

您的任务是将输入的值存储到字符串数据类型变量中,这一切都很好,但在某些时候您希望执行值比较以确保所有输入的值实际上都在彩票。

当用户完成他/她的输入时,您会在 num 字符串变量中得到一个以空格分隔的字符串。您现在需要确保输入的这些值确实是......从 1 到 59 的数字,并且没有包含字母字符。

在我看来(这只是因为您需要将输入的值存储到一个字符串变量中),最好使用您的字符串变量来收集用户输入,然后测试输入以确保它确实是一个字符串表示一个实际的整数。一旦确定了这一点,我们就会进行测试以确保是否在最小值/最大值范围内 (1-59)。现在我们需要测试以确保之前没有为这张票输入过输入的号码。

当然,对于上述每个测试,如果测试失败,则应提示用户重新输入正确的值。您可以通过使用 while 循环来做到这一点。 StackOverflow 中有很多这样的例子,但这里有一个简单的例子:

Scanner scan = new Scanner(System.in);
String ticketNumbers = "";
for(int i = 0; i < 6; i++) {
    Boolean isOK = false;
    while (!isOK) {
        System.out.println("\nPlease enter your desired 6 ticket numbers:\n"
                + "(from 1 to 59 only)");
        String num = scan.nextLine(); 
        //Is the string entered an actual integer number?
        //We use the String.matches() method for this with
        //a regular expression.
        if(!num.matches("\\d+")) {
            System.out.println("You must supply a numerical value! "
                    + "Try Again...");
            continue;
        }
        if (ticketNumbers.contains(num + " ")) {
            System.out.println("The number you supplied has already been chosen!"
                    + " Try Again...");
            continue;
        }
        if (Integer.parseInt(num) >= 1 && Integer.parseInt(num) <= 59) {
            ticketNumbers+= num + " ";
            isOK = true;
        }
        else {
            System.out.println("The number you supply must be from "
                    + "1 to 59! Try Again...");
        }
    }
}
System.out.println("Ticket printed £2. Your numbers are " + ticketNumbers);

【讨论】:

    【解决方案2】:

    怎么样-

    if(Integer.parseInt(num) < 0 || Integer.parseInt(num) > 59)
    

    这应该可以,把它放在输入之后。

    如果有效,请将其标记为正确,我需要代表!!!

    【讨论】:

    • OP 在问题中说他们不想使用Integer.parseInt
    • 嗯,他说他创造了另一个变量...我已经做到了,但你可能是对的。
    • 这似乎正是我所需要的,但是当执行此代码时,它会引发异常
    • @ChrisLynch 所以你实际上是在检查整个系列的数字,而不仅仅是一个?问题中并不清楚。
    • @DawoodibnKareem 我正在检查用户输入的每个数字,如果是 1 个数字或 6 个数字,它没有区别吗?
    【解决方案3】:

    简单的方法是添加可用数字(假设它不会增长超过 60。您也可以使用循环来添加)

    String numbers[] = {"1","2","3", "..."};
    

    然后在循环内

     Arrays.asList(numbers).contains(num);
    

    您可以删除前缀零以避免与 '02' 等值发生冲突

    这里的一切都与String 相关。

    【讨论】:

      【解决方案4】:

      如果您不想显式转换为int,可以使用正则表达式。

      if (num.matches("[1-5]?[0-9]")) {
          ...
      

      这会检查字符串是否由 (1) 可能 一个从 1 到 5 的数字组成,然后是 (2) 肯定 一个从 0 到 9 的数字。将匹配 0-59 范围内的任何数字。

      如果您有一系列用空格分隔的数字,您可以将其扩展为涵盖整个系列。

      if (num.matches("([1-5]?[0-9]\\s+)*[1-5]?[0-9]")) {
      

      这匹配“一个数字后跟空格”的任意数量的重复(包括零),然后是一个没有空格的重复。 "\\s" 表示“任何空白字符”,"+" 表示“前面的一个或多个”,"*" 表示“前面的零个以上” - 在这种情况下是括号中的术语.

      【讨论】:

        【解决方案5】:

        哦,我明白你要做什么了

        这就是你想要的

            Scanner scan = new Scanner(System.in);
        
        
        String allNums = "";
        
        
        for(int i =0; i<6; i++) 
        {
            System.out.println("Enter your number between 1-59");
            int num = scan.nextInt();//Take the number in as an int 
        
            if(num >0 && num < 59)//Check if it is in range
            {
                allNums += num + " ";//if it is add it to a string
            }
            else
            {
                System.out.println("Number not in range");
                i--;//go back one iteration if its not in range
            }
        
        
        }
        
        System.out.println("Ticket printed £2. Your numbers are " + allNums);
        

        【讨论】:

        • 但它说数字必须存储在字符串中
        • Michael:他还说他想比较字符串中的数值。不,他不想要字符串,因为如果他这样做了,他将无法以他需要的方式体面地比较它们,他只是对数据类型及其能力感到困惑
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多