我正在使用gui编写一个程序,它将验证邮政编码是否正确格式化,如K2S,1W3。但是,如果我输入类似K2S 1W3333333的东西,它仍然会验证它。这是我的计划:
@Override
public void mouseClicked(MouseEvent arg0) {
String postal =txtInput.getText() ;
boolean error_found = false;
for (int j = 0; j < postal.length(); j++){
//check if charAt j is a letter
if (j == 0 || j == 2 || j == 5){
if (postal.charAt(j) >= 65 && postal.charAt(j) <= 90){
;
}
else
error_found = true;
}
//check if charAt j is a number
if(j == 1 || j == 4 || j == 6){
if (postal.charAt(j) >= 48 && postal.charAt(j) <= 57){
;
}
else
error_found = true;
}
}
if (error_found == true){
lblResult.setText("Error, please try again. Make sure your code is capital letters and numbers only and 6 characters. Ex: K2S 1W3");
}
else
{
lblResult.setText("That code is valid!");
}
}
});
} }
答案 0 :(得分:1)
使用正则表达式来检查模式。它会更容易!
例如
[A-Z]{1}[0-9]{1}[A-Z]{1}
将匹配KS2和1W3(不知道邮政编码格式是什么,即&#34;,&#34;是否需要部分内容,如果您接受空白字符等等!)无论哪种方式,正则表达式是要走的路
修改强> 假设您需要完全匹配&#34; KS2,1W3&#34;然后
^[A-Z][0-9][A-Z],[0-9][A-Z][0-9]$
是正在进行的正则表达式
答案 1 :(得分:0)
问题是如果索引大于这些值,if
语句将无法在程序中执行。解决此问题的最简单方法是在for
语句之前添加此内容。
if(postal.length() != 6)error_found = true;
如果表达式中有逗号,请将其从6开始。
这将有效,但不是最优雅的解决方案,使用正则表达式。
为了提高您的工作效率,break
一旦发现错误,您就不会继续完成
答案 2 :(得分:0)
字符串,&#34; K2S 1W3333333&#34;可以检查是否检查固定的字符串长度。请参阅以下代码段,尤其是
行int len = postal.length();
if ((len == 7) && (postal.charAt(3) != ' '))
和/或......
} else if ((len != 6) && (len != 7)) {
在阅读了Postal codes in Canada的一些基本规则之后,这里有一个检查有效性的快速代码段:
public class App {
public static boolean checkCode(String postal) {
if (postal == null || postal.isEmpty()) {
System.out.println("Empty postal code");
return false;
}
int len = postal.length();
if ((len == 7) && (postal.charAt(3) != ' ')) {
System.out.println("Invalid postal code length (7 characters requires space in middle of code)");
return false;
} else if ((len != 6) && (len != 7)) {
System.out.println("Invalid postal code length (6 characters required)");
return false;
}
if (len == 7) {
postal = postal.replace(" ", "");
len = postal.length();
}
final char[] invalidUpLetters = { 'D', 'F', 'I', 'O', 'Q', 'U' };
final char[] invalidLowLetters = { 'd', 'f', 'i', 'o', 'q', 'u' };
for (int i = 0; i < len; ++i) {
final char c = postal.charAt(i);
if (i % 2 == 0) {
if (!Character.isLetter(c)) {
System.out.println("Invalid letter at postal code string index: " + i);
return false;
}
for (int j = 0; j < invalidUpLetters.length; ++j) {
if ((c == invalidUpLetters[j]) || (c == invalidLowLetters[j])) {
System.out.println("Invalid letter used in postal code, string index: " + i);
return false;
}
}
if ((i == 0) && (c == 'W' || c == 'w' || c == 'Z' || c == 'z')) {
System.out.println("First position letter cannot be W or Z");
return false;
}
} else if ((i % 2 == 1) && (!Character.isDigit(c))) {
System.out.println("Invalid digit at postal code string index: " + i);
return false;
}
}
return true;
}
public static void main(String[] args) {
args = new String[] { "K2S 1W3333333", "K2S 1W3", "K2S1W3" };
System.out.println("is valid postal? " + (checkCode(args[0]) ? "Yes" : "No"));
System.out.println("is valid postal? " + (checkCode(args[1]) ? "Yes" : "No"));
System.out.println("is valid postal? " + (checkCode(args[2]) ? "Yes" : "No"));
}
}
这是一项广泛的检查,包括用于检查相应索引处的字母/数字的逻辑,以及第一个字母是否有效的情况,以及这些字母是否/应该被排除在一起。该片段还包括检查是否在6位邮政编码的中间添加空格。警惕角色!
你也可以从checkCode()方法中删除System.out.println()并坚持使用布尔值 - 这有助于清除一些调试并使代码更容易阅读 - 对于为简单起见(只需要使用该方法来检查字符串是否是有效的加拿大邮政编码)。
编辑:如果您获得更多输入邮政编码变体,例如&#34; K2S,1W3&#34;如原始帖子中所述,请考虑对我的代码段中显示的字符进行规范化/解析,以便更轻松地阅读邮政编码。
干杯