如果用户的输入是小数、分数、混合分数或无效,我如何确定?
这是我的程序上允许的输入
String[] s = new String[]{ "0",".",".0",".01","1.","1.0","1.01", "1 ","1 1","1/2","1/","1/0", "1 1/1", "1 0/0","1 /","1 /0", "1 0/"};
预期输出:
0) 0 ---- Zero
1) . ---- Error
2) .0 ---- Zero
3) 0.01 ---- Decimal
4) 1. ---- Decimal(the input 1. should be turned to decimal)
5) 1.0 ---- Decimal
6) 1.01 ---- Decimal
7) 1 ---- Decimal(the input with space after the whole number must be decimal)
8) 1 1 ---- Error(because of the space between the 1)
9) 1/2 ---- Fraction
10) 1/ ---- Error
11) 1/0 ---- Error
12) 1 1/1 ---- Mixed Fraction
13) 1 0/0 ---- Error
14) 1 / ---- Error
15) 1 /0 ---- Error
16) 1 0/ ---- Error
实际输出:
0) 0 ---- Zero
1) . ---- Error
2) .0 ---- Zero
3) 0.01 ---- Decimal
4) 1. ---- Error
5) 1.0 ---- Decimal
6) 1.01 ---- Decimal
7) 1 ---- Error
8) 1 1 ---- Mixed Fraction
9) 1/2 ---- Fraction
10) 1/ ---- Fraction
11) 1/0 ---- Fraction
12) 1 1/1 ---- Mixed Fraction
13) 1 0/0 ---- Error
14) 1 / ---- Error
15) 1 /0 ---- Error
16) 1 0/ ---- Error
我对如何构建一个好的正则表达式模式没有太多知识?
我的代码:
public class DecimalOrFraction {
public static void main(String args[]){
String[] s = new String[]{ "0",".",".0",".01","1.","1.0","1.01", "1 ","1 1","1/2","1/","1/0", "1 1/1", "1 0/0","1 /","1 /0", "1 0/"};
for (int x = 0 ;x<s.length;x++) {
if(s[x].matches("[0]?([.][0]{1,3}\s{0,1})?")){
System.out.println(x+") "+s[x]+" ---- Zero");
}
else if(s[x].matches("\d{0,3}([.]\d{1,3}\s{0,1})?")){
System.out.println(x+") "+Float.valueOf(s[x])+" ---- Decimal");
}
else if(s[x].matches("[1-9]{1,5}([.]\d{1,3})?\s[1-9]\d{0,2}([/]\d{0,3})?")){
System.out.println(x+") "+s[x]+" ---- Mixed Fraction");
}
else if(s[x].matches("[1-9]\d{0,4}[/]\d{0,3}")){
System.out.println(x+") "+s[x]+" ---- Fraction");
}
else{
System.out.println(x+") "+s[x]+" ---- Error");
}
}
}
}
为了展示将函数拆分为多个部分时可以做什么,我创建了一些代码。请注意,这并不构成一个明确的(类)设计。
这段代码的优点是,您可以用您解析的值来执行操作。提供良好的错误消息也很有用。如果将main
方法进一步拆分,则可以创建一个实时验证值的解析器(例如,如果希望在GUI中验证值,则非常有用)。
public class Numbers {
private static final String[] s = new String[]{ "0",".",".0",".01","1.","1.0","1.01", "1 ","1 1","1/2","1/","1/0", "1 1/1", "1 0/0","1 /","1 /0", "1 0/"};
private static final Pattern FRACTION_PATTERN = Pattern.compile("(?:(\d+)\s+)?(\d+)/(\d+)");
public static void main(String[] args) {
int counter = 0;
for (String value : s) {
counter++;
String trimmedValue = value.trim();
if (isNumber(trimmedValue)) {
System.out.printf("%d) %s ---- Natural number%n", counter, trimmedValue);
continue;
}
boolean parseDecimal = isProbablyDecimal(trimmedValue);
boolean parseFraction = isProbablyFraction(trimmedValue);
if (parseDecimal && parseFraction) {
System.out.printf("%d) %s ---- Error (both decimal & fraction)%n", counter, trimmedValue);
continue;
}
if (parseDecimal) {
if (!trimmedValue.matches("\d*[.]\d+")) {
System.out.printf("%d) %s ---- Error (invalid decimal)%n", counter, trimmedValue);
continue;
}
System.out.printf("%d) %s ---- Decimal value%n", counter, trimmedValue);
continue;
}
if (parseFraction) {
Matcher m = FRACTION_PATTERN.matcher(trimmedValue);
if (!m.matches()) {
System.out.printf("%d) %s ---- Error (invalid faction)%n", counter, trimmedValue);
continue;
}
if (Integer.valueOf(m.group(3)) == 0) {
System.out.printf("%d) %s ---- Error (division by zero in fraction)%n", counter, trimmedValue);
continue;
}
if (m.group(1) != null) {
System.out.printf("%d) %s ---- Mixed fraction%n", counter, trimmedValue);
continue;
}
System.out.printf("%d) %s ---- Fraction%n", counter, trimmedValue);
continue;
}
System.out.printf("%d) %s ---- Error (Cannot make bread out of it)%n", counter, trimmedValue);
continue;
}
}
public static boolean isNumber(String value) {
return value.matches("\d+");
}
public static boolean isProbablyDecimal(String value) {
// note, some countries use comma instead of dot
return value.contains(".");
}
public static boolean isProbablyFraction(String value) {
return value.contains("/");
}
}
输出:
1) 0 ---- Natural number
2) . ---- Error (invalid decimal)
3) .0 ---- Decimal value
4) .01 ---- Decimal value
5) 1. ---- Error (invalid decimal)
6) 1.0 ---- Decimal value
7) 1.01 ---- Decimal value
8) 1 ---- Natural number
9) 1 1 ---- Error (Cannot make bread out of it)
10) 1/2 ---- Fraction
11) 1/ ---- Error (invalid faction)
12) 1/0 ---- Error (division by zero in fraction)
13) 1 1/1 ---- Mixed fraction
14) 1 0/0 ---- Error (division by zero in fraction)
15) 1 / ---- Error (invalid faction)
16) 1 /0 ---- Error (invalid faction)
17) 1 0/ ---- Error (invalid faction)
试试这个:d+.d+|d+.$|^.0$|d+/[1-9]+|d+ d+/[1-9]+
这将为您的示例返回正确的值:
^(d*.?d*)s?(d+/[1-9]d*)?$
RegExr 的工作示例
在Java中,它将是:^(\d*\.?\d*)\s?(\d+/[1-9]\d*)?$