我搜索了这个问题并从“大驼鹿沙龙”网站得到了答案,这与我写的略有不同。像这样的网站程序:
if (social.length() == 11) {
valid = true;
// Check that the characters are valid
// Valid as digits
char index0 = social.charAt(0);
char index1 = social.charAt(1);
char index2 = social.charAt(2);
char index4 = social.charAt(4);
char index5 = social.charAt(5);
char index7 = social.charAt(7);
char index8 = social.charAt(8);
char index9 = social.charAt(9);
char index10 = social.charAt(10);
// Valid as hyphen
char index3 = social.charAt(3);
char index6 = social.charAt(6);
if (Character.isDigit(index0) && Character.isDigit(index1)
&& Character.isDigit(index2) && Character.isDigit(index4)
&& Character.isDigit(index5) && Character.isDigit(index7)
&& Character.isDigit(index8) && Character.isDigit(index9)
&& Character.isDigit(index10) && index3 == '-'
&& index6 == '-') {
valid = true;
}
} else
valid = false;
return valid;
地雷是这样的:
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.println("Enter your Social security number as DDD-DD-
DDDD");
String str = input.nextLine();
if (str.length()==11) {
System.out.println("Invalid input");
if(Character.isDigit(str.charAt(0))&&Character.isDigit(str.charAt(1))
&&Character.isDigit(str.charAt(2))&&Character.isDigit(str.charAt(4))
&&Character.isDigit(str.charAt(5))&&Character.isDigit(str.charAt(7))
&&Character.isDigit(str.charAt(8))&&Character.isDigit(str.charAt(9))
&&Character.isDigit(str.charAt(10))
&&((str.substring(3,6)).startsWith("-")&&
((str.substring(3,6)).endsWith("-"))) {
System.out.println("The enter is valid");
}
}
else {
System.out.println("The enter is invalid");
}
}
}
我想知道为什么我的程序错了(即使我输入123-45-6789它也说“无效”)?
答案 0 :(得分:2)
str.substring(3,6).endsWith("-")
表示从字符3到包括字符6的子字符串排除。原始字符串中的第一个字符是字符0。
你的第二个破折号位于第6位,所以你应该改为substring(3,7)
。
更好的解决方案是使用String#charAt(int)
实际检查这两个字符。就像你在“大驼鹿沙龙”中找到的解决方案一样。
理想的解决方案是使用正则表达式。它允许您将现有的多行非常难以阅读的代码转换为单个表达式:
if (str.matches("\\d{3}\\-\\d{2}\\-\\d{4}")) {
System.out.println("The enter is valid");
} else {
System.out.println("The enter is invalid");
}
答案 1 :(得分:0)
此处将代码更改为此只是一些小修改
我还提到了更改
import java.util.Scanner;
public class SSN {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.println("Enter your Social security number as DDD-DD-DDDD");
String str = input.nextLine();
if (str.length() != 11) {//use != in place of ==
System.out.println("Invalid input");
} else if (Character.isDigit(str.charAt(0)) && Character.isDigit(str.charAt(1))
&& Character.isDigit(str.charAt(2)) && Character.isDigit(str.charAt(4))
&& Character.isDigit(str.charAt(5)) && Character.isDigit(str.charAt(7))
&& Character.isDigit(str.charAt(8)) && Character.isDigit(str.charAt(9))
&& Character.isDigit(str.charAt(10))
&& (str.charAt(3) == '-') && (str.charAt(6) == '-')) {//use charAt()
System.out.println("The enter is valid");
} else {
System.out.println("The enter is invalid");
}
}
}
一切正常。
但是如果你想要最短的代码,那么使用正则表达式
注意: 下面给出的代码使用https://stackoverflow.com/users/1501234/jaroslaw-pawlak给出的语法如果您使用下面给出的代码,请归功于原作者
import java.util.Scanner;
public class SSN {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.println("Enter your Social security number as DDD-DD-DDDD");
String str = input.nextLine();
if (str.matches("\\d{3}\\-\\d{2}\\-\\d{4}")) {
System.out.println("The enter is valid");
} else {
System.out.println("The enter is invalid");
}
}
}