Java加拿大邮政编码计划,

时间:2016-10-06 21:47:47

标签: java postal-code

我正在使用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!");
            }
            }
            });

} }

3 个答案:

答案 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;如原始帖子中所述,请考虑对我的代码段中显示的字符进行规范化/解析,以便更轻松地阅读邮政编码。

干杯