如何检测 Java 中不同的非数字输入?
How to detect different non-numerical input in Java?
我正在尝试创建一个程序来计算以下形式的用户输入:分数、带分数和小数。我对分数输入没有问题,我所拥有的是带分数和小数。
import java.util.Scanner;
public class Fraction {
public static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//ignore all non-numerical input
//how to detect if that non-numerical input is '/' or '.', or ' ' (blank space)?
scan.useDelimiter("\D");
int num, den;
num = scan.nextInt();
den = scan.nextInt();
int GCD = gcd(num, den);
num = num / GCD;
den = den / GCD;
if (den == 0) {
System.out.println("Invalid denominator, cannot divide by 0");
} else {
System.out.println("Fraction: "+num+"/"+den);
if (num > den) {
System.out.println("Mixed Fraction: "+(num / den)+" "+(num % den)+"/"+den);
} else {
System.out.println("Mixed Fraction: N/A");
}
System.out.println("Decimal: "+((double) num / (double) den));
}
scan.close();
}
}
现在,我只能输入分数,不能输入带分数或小数。这是一个分数输入的正确输出示例:
Input:
46/22
Output:
Fraction: 23/11
Mixed Fraction: 2 1/11
Decimal: 2.090909090909091
我需要创建一个程序可以自动检测非数字输入是“/”、“”(空白 space)还是“.”的程序。区分分数、带分数和小数。有什么办法可以做到吗?
注意:我是 Java 的新手,我唯一学过的其他语言是 C。
建议:
- 读取用户输入的整行 (
scanner.nextLine()
)
- 使用正则表达式(
Pattern
和Matcher
)检测是哪种输入大小写(分数、带分数、小数)
- 如果匹配,使用捕获组
提取值
- 如果 none 个案例匹配,告诉用户输入格式是 无效.
您需要的模式如下:
Pattern DECIMAL = Pattern.compile("\s*(-?\d+(?:\.\d+)?)\s*");
Pattern FRACTION = Pattern.compile("\s*(-?\d+)\s*\/\s*(\d+)\s*");
Pattern MIXED_FRACTION = Pattern.compile("\s*(-?\d+)\s+(\d+)\s*\/\s*(\d+)\s*");
提示:这些模式也接受负值,例如 -3.14
、-5/8
和 -2 1/3
),并且对空格宽容(-2 3 / 4
与 -2 3/4
).
匹配并提取值:
String line = scanner.nextLine();
Matcher matcher = DECIMAL.matcher(line);
if (matcher.matches()) {
System.out.println("Decimal: " + matcher.group(1));
}
matcher = FRACTION.matcher(line);
if (matcher.matches()) {
System.out.println("Fraction: " + matcher.group(1) + "/" + matcher.group(2));
}
matcher = MIXED_FRACTION.matcher(line);
if (matcher.matches()) {
System.out.println("Mixed Fraction: " + matcher.group(1) + " " + matcher.group(2) + "/" + matcher.group(3));
}
提示:如果你是正则表达式的新手,想了解它的每一部分的作用,或者你想构建和测试它们,网上有很多有用的使用的工具,例如regex101.com。将 Java 代码中的表达式粘贴到这些工具中时,只需确保删除转义的反斜杠 (\
-> \
)。
如果您只想读入普通分数,您可以使用定界符(例如 scan.useDelimiter("/"); )
但是,如果您希望能够读取不同的输入,则必须使用字符串,如以下代码中的完整解决方案所示:
import java.util.Scanner;
public class Fraction {
public static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
public static void main(String[] args) {
boolean run = true;
Scanner scan = new Scanner(System.in);
scan.useDelimiter(System.lineSeparator());
do {
String input = scan.next();
int num = 0, den = 0;
if (input.matches("-?\d*\.\d*")) {
// input is floating point number... convert it, may
// fits better for you
String[] splittedinput = input.split("\.");
num = Integer.parseInt(splittedinput[0] + splittedinput[1]);
den = (int) Math.pow(10, splittedinput[1].length());
} else if (input.matches("-?\d* \d*/\d*")) {
String[] splittedinput = input.split("/");
String[] splittedfront = splittedinput[0].split(" ");
den = Integer.parseInt(splittedinput[1]);
num = Integer.parseInt(splittedfront[0]) * den + Integer.parseInt(splittedfront[1]);
} else if (input.matches("-?\d*/\d*")) {
String[] splittedinput = input.split("/");
num = Integer.parseInt(splittedinput[0]);
den = Integer.parseInt(splittedinput[1]);
} else if (input.contentEquals("q")){
run=false;
System.out.println("quit programm");
continue;
} else {
System.out.println("invalid input, plese type in Fraction, Decimal or Mixed Fraction");
continue;
}
int gcd = gcd(num, den);
num = num / gcd;
den = den / gcd;
if (den == 0) {
System.out.println("Invalid denominator, cannot divide by 0");
} else {
System.out.println("Fraction: " + num + "/" + den);
if (num > den) {
System.out.println("Mixed Fraction: " + (num / den) + " " + (num % den) + "/" + den);
} else {
System.out.println("Mixed Fraction: " + num);
}
System.out.println("Decimal: " + ((double) num / (double) den));
}
} while (run);
scan.close();
}
}
我正在尝试创建一个程序来计算以下形式的用户输入:分数、带分数和小数。我对分数输入没有问题,我所拥有的是带分数和小数。
import java.util.Scanner;
public class Fraction {
public static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//ignore all non-numerical input
//how to detect if that non-numerical input is '/' or '.', or ' ' (blank space)?
scan.useDelimiter("\D");
int num, den;
num = scan.nextInt();
den = scan.nextInt();
int GCD = gcd(num, den);
num = num / GCD;
den = den / GCD;
if (den == 0) {
System.out.println("Invalid denominator, cannot divide by 0");
} else {
System.out.println("Fraction: "+num+"/"+den);
if (num > den) {
System.out.println("Mixed Fraction: "+(num / den)+" "+(num % den)+"/"+den);
} else {
System.out.println("Mixed Fraction: N/A");
}
System.out.println("Decimal: "+((double) num / (double) den));
}
scan.close();
}
}
现在,我只能输入分数,不能输入带分数或小数。这是一个分数输入的正确输出示例:
Input:
46/22
Output:
Fraction: 23/11
Mixed Fraction: 2 1/11
Decimal: 2.090909090909091
我需要创建一个程序可以自动检测非数字输入是“/”、“”(空白 space)还是“.”的程序。区分分数、带分数和小数。有什么办法可以做到吗?
注意:我是 Java 的新手,我唯一学过的其他语言是 C。
建议:
- 读取用户输入的整行 (
scanner.nextLine()
) - 使用正则表达式(
Pattern
和Matcher
)检测是哪种输入大小写(分数、带分数、小数) - 如果匹配,使用捕获组 提取值
- 如果 none 个案例匹配,告诉用户输入格式是 无效.
您需要的模式如下:
Pattern DECIMAL = Pattern.compile("\s*(-?\d+(?:\.\d+)?)\s*");
Pattern FRACTION = Pattern.compile("\s*(-?\d+)\s*\/\s*(\d+)\s*");
Pattern MIXED_FRACTION = Pattern.compile("\s*(-?\d+)\s+(\d+)\s*\/\s*(\d+)\s*");
提示:这些模式也接受负值,例如 -3.14
、-5/8
和 -2 1/3
),并且对空格宽容(-2 3 / 4
与 -2 3/4
).
匹配并提取值:
String line = scanner.nextLine();
Matcher matcher = DECIMAL.matcher(line);
if (matcher.matches()) {
System.out.println("Decimal: " + matcher.group(1));
}
matcher = FRACTION.matcher(line);
if (matcher.matches()) {
System.out.println("Fraction: " + matcher.group(1) + "/" + matcher.group(2));
}
matcher = MIXED_FRACTION.matcher(line);
if (matcher.matches()) {
System.out.println("Mixed Fraction: " + matcher.group(1) + " " + matcher.group(2) + "/" + matcher.group(3));
}
提示:如果你是正则表达式的新手,想了解它的每一部分的作用,或者你想构建和测试它们,网上有很多有用的使用的工具,例如regex101.com。将 Java 代码中的表达式粘贴到这些工具中时,只需确保删除转义的反斜杠 (\
-> \
)。
如果您只想读入普通分数,您可以使用定界符(例如 scan.useDelimiter("/"); ) 但是,如果您希望能够读取不同的输入,则必须使用字符串,如以下代码中的完整解决方案所示:
import java.util.Scanner;
public class Fraction {
public static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
public static void main(String[] args) {
boolean run = true;
Scanner scan = new Scanner(System.in);
scan.useDelimiter(System.lineSeparator());
do {
String input = scan.next();
int num = 0, den = 0;
if (input.matches("-?\d*\.\d*")) {
// input is floating point number... convert it, may
// fits better for you
String[] splittedinput = input.split("\.");
num = Integer.parseInt(splittedinput[0] + splittedinput[1]);
den = (int) Math.pow(10, splittedinput[1].length());
} else if (input.matches("-?\d* \d*/\d*")) {
String[] splittedinput = input.split("/");
String[] splittedfront = splittedinput[0].split(" ");
den = Integer.parseInt(splittedinput[1]);
num = Integer.parseInt(splittedfront[0]) * den + Integer.parseInt(splittedfront[1]);
} else if (input.matches("-?\d*/\d*")) {
String[] splittedinput = input.split("/");
num = Integer.parseInt(splittedinput[0]);
den = Integer.parseInt(splittedinput[1]);
} else if (input.contentEquals("q")){
run=false;
System.out.println("quit programm");
continue;
} else {
System.out.println("invalid input, plese type in Fraction, Decimal or Mixed Fraction");
continue;
}
int gcd = gcd(num, den);
num = num / gcd;
den = den / gcd;
if (den == 0) {
System.out.println("Invalid denominator, cannot divide by 0");
} else {
System.out.println("Fraction: " + num + "/" + den);
if (num > den) {
System.out.println("Mixed Fraction: " + (num / den) + " " + (num % den) + "/" + den);
} else {
System.out.println("Mixed Fraction: " + num);
}
System.out.println("Decimal: " + ((double) num / (double) den));
}
} while (run);
scan.close();
}
}