【问题标题】:Java Canadian Postal Code Program,Java 加拿大邮政编码计划,
【发布时间】:2016-10-06 21:47:47
【问题描述】:

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

} }

【问题讨论】:

  • 你考虑过使用正则表达式吗?看来您可能是编程新手。那是你最好的方法。如果这是一个班级作业并且您不能使用正则表达式,那么您需要维护一个字符计数器。
  • 不要使用 &gt;= 65&lt;= 90&gt;= 48&lt;= 57。它掩盖了意图。使用&gt;= 'A'&lt;= 'Z'&gt;= '0'&lt;= '9'
  • @Andreas 我会,但老师要我那样做。
  • 哇,老师真笨,要求任何查看代码的人都必须记住 ASCII 表才能理解代码,而这种语言使得编写自文档变得如此容易。跨度>

标签: java postal-code


【解决方案1】:

使用正则表达式来检查模式。会更容易!

例如

[A-Z]{1}[0-9]{1}[A-Z]{1} 

将匹配 KS2 和 1W3(不确定邮政编码格式是什么,即“,”是否需要作为其中的一部分,如果您接受空格字符等!)无论哪种方式,正则表达式都是要走的路

编辑 假设您需要完全匹配“KS2,1W3”之上然后

^[A-Z][0-9][A-Z],[0-9][A-Z][0-9]$

是可以做到这一点的正则表达式

【讨论】:

  • 我认为我们还没有做正则表达式,但还是谢谢!以后对我有帮助!
  • 根据Wikipedia,它们之间用空格分隔,而不是逗号。另请注意,当使用 Java 的 matches() 方法时,锚点 ^$ 是多余的。
【解决方案2】:

问题是如果索引大于这些值,if 语句将不会在您的程序中执行。在不做太多改动的情况下解决此问题的最简单方法是将其添加到您的 for 语句之前。

if(postal.length() != 6)error_found = true; 

如果表达式中有逗号,则将其从 6 变为 7。

这可行,但不是最优雅的解决方案,请使用正则表达式。

为了改进你必须使它更有效率,还有break一旦你发现一个错误,所以你不要继续经历

【讨论】:

    【解决方案3】:

    字符串“K2S 1W3333333”可以在检查固定字符串长度时被捕获。请参阅下面的 sn-p,尤其是行

    int len = postal.length();
    if ((len == 7) && (postal.charAt(3) != ' '))
    

    和/或...

    } else if ((len != 6) && (len != 7)) {
    

    在阅读了Postal codes in Canada 的一些基本规则后,这里有一个检查有效性的快速 sn-p:

    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"));
        }
    }
    

    这是一项广泛的检查,包括检查各个索引处的字母/数字的逻辑,以及第一个字母是否有效,以及这些字母是否/应该一起被排除在外。 sn-p 还包括检查是否在 6 位邮政编码中间添加空格。小心字符!

    您还可以从 checkCode() 方法中删除 System.out.println() 并坚持使用布尔值 - 这将有助于清除一些调试并使代码更易于阅读 - 为了简单起见(只需使用该方法检查字符串是否为有效的加拿大邮政编码)。

    编辑:如果您得到更多输入邮政编码的变体,例如原始帖子中所述的“K2S,1W3”,请考虑规范化/解析出我的 sn-p 中显示的字符,以便更轻松地阅读邮政编码.

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      相关资源
      最近更新 更多