【问题标题】:How to check if user input is a certain base?如何检查用户输入是否是某个基础?
【发布时间】:2017-04-25 23:10:01
【问题描述】:

我正在开发一个有 4 种模式的计算器程序。
二进制(以 2 为底)、八进制(以 8 为底)、十进制(以 10 为底)和十六进制(以 16 为底)。

我想知道如何检查输入的用户输入是否与当前模式匹配。例如,如果计算器设置为八进制模式,我如何检查用户输入的内容是否以 8 为基数?或者如果它处于十六进制模式,如何检查它是否以 16 为基数?

程序以十进制模式启动并显示此菜单。

private static String displayMenu(String mode) {
    @SuppressWarnings("resource")
    Scanner input = new Scanner(System.in);
    System.out.println(mode + " mode\n");
    System.out.println("Bin - Binary               +");
    System.out.println("Oct - Octal                -");
    System.out.println("Dcm - Decimal              *");
    System.out.println("Hex - Hexadecimal          /");
    System.out.println("Q   - Quit                 =");
    System.out.print("Option or value: ");
    String option = input.nextLine();
    option.toUpperCase();
    return option;
}

用户可以更改模式或输入当前模式的值。

【问题讨论】:

  • 这是命令行程序还是 GUI 程序?
  • 这是一个命令行程序。
  • 用户如何指定“模式”?
  • 假设如果可以检测到当前模式,您可以验证用户输入对于给定模式是否有效。这个post 可能有助于验证十进制、二进制模式。八进制,十六进制。

标签: java java.util.scanner user-input


【解决方案1】:

一般来说,有两种方法可以处理用户输入:1) 限制允许用户提供的输入内容或 2) 验证输入并在输入无效时显示错误消息。对于这个特定的程序,我建议以下任何一种:

  1. 如果这是一个带有每个数字按钮的 GUI 程序(例如在物理计算器上),您可以在用户选择模式后立即更改可用按钮。例如,当用户选择八进制模式时,仅提供数字 0 到 8 的按钮。这会自动禁止用户键入 9 或任何字母。

  2. 如果程序是基于文本的,或者您允许用户从键盘输入数字,您将需要解析输入。一种方法是使用Integer.parseInt()。此功能的一个版本允许您指定基数,这将由用户选择的模式决定。当输入字符串包含无效字符时会抛出异常。您可以捕获异常并显示相应的错误消息。

【讨论】:

    【解决方案2】:

    对于八进制,八进制数字通常以前面的零表示,例如 012。十六进制数字通常以 0x 开头,例如 0xFF。

    您可以将用户的输入读取为字符串,然后查看前几个字符以查看数字是以 0 开头(但不仅仅是 0)还是以“0x”开头。

    您必须对二进制做一些不同的事情,因为您无法真正分辨 1001 是二进制还是十进制。

    【讨论】:

    • Java 有一个二进制字面量:0b
    【解决方案3】:

    我建议您获取数字并将其转换为字符串(可能无法选择十六进制值),然后通过正则表达式运行它们以查看它是否通过。比如:

    [0-1]+ //Binary
    [0-7]+ //Octal
    [0-9]+ //Decimal
    [0-9A-F]+ //Hexadecimal
    

    我确信这些可以改进。请注意,在某些情况下,一个数字会匹配多个表达式。

    【讨论】:

    • 请注意,OP 正在验证输入,根据定义,输入已经是一个字符串。
    • 这仅适用于您仅使用 4 个碱基的情况。如果您必须使用除了这 4 个之外的任何其他基础,那么它将不起作用。
    【解决方案4】:

    某个数字可以匹配多个基数,因此您无法确定输入的数字是哪个基数。如果用户以既定格式输入数字,您可以使用@Apitosu 的答案来检查其基数。

    如果你只是想检查输入的数字是否对某个基数有效,你可以使用Long.parseLong的重载,它接收一个基数作为第二个参数,如果出现以下情况会引发异常该数字对于所选基数无效。

    Source.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多