我有这种方法,我验证和ID,我遇到了问题。 ID必须遵循这些规则才有效:
以下是代码:
public static String getCartId(String cartId) {
Boolean correctId = false;
while (!correctId) {
cartId = JOptionPane.showInputDialog("Type the Cart ID:");
cartId = cartId.trim();
cartId = cartId.toUpperCase();
char c = cartId.charAt(0);
// VALIDATION
if (cartId.length() != 6)
JOptionPane.showMessageDialog(null, "Cart ID must have only 6 chars, type it again.");
else if (c != 'A' || c != 'E' || c != 'P')
JOptionPane.showMessageDialog(null, "Invalid Cart ID, type it again.");
else
correctId = true;
}
return cartId;
}
如果我输入,请说 aaaaaa ,最后会说这个ID无效。
任何有关错误的想法?
答案 0 :(得分:5)
尝试替换它:
else if (c != 'A' || c != 'E' || c != 'P')
使用&&
代替||
,如下所示:
else if (c != 'A' && c != 'E' && c != 'P')
答案 1 :(得分:1)
我相信你最好使用这样的正则表达式:
if (cartId.matches("(?s)([AEP]{1}[A-Z0-9]{5})")) {
...}
答案 2 :(得分:1)
这种情况正在发生, || 是短路运算符。Read this
在你的情况下
let z = [x, y].flatMap { $0 }.reduce(0, combine: +)
此处else if (c != 'A' || c != 'E' || c != 'P')
返回 false 。因此,它会检查下一个条件c != 'A'
,它会向其返回 true ,因此会将您的ID设置为无效。
尝试将其替换为 AND ,就像&&
一样c != 'E'
或者如果您想尝试其他方法,只需谷歌使用正则表达式,并使用 [ACP] ..... 作为正则表达式。它会将您的代码减少到两行验证。
答案 3 :(得分:1)
您已使用
(c != 'A' || c != 'E' || c != 'P')
这是不对的。
根据您的要求,如果c不等于A或E或P,则需要 只有这样才能将其打印为无效。但是什么||确实如此,如果给定条件中的任何一个为真,则返回true。这意味着如果c =' A',则第一个条件为false,但其他两个条件为true,因此整个if语句的值返回true。
替换它(c != 'A' && c != 'E' && c != 'P')
将有所帮助,因为只有在所有条件都为真时才返回true。因此,如果c =' A',则第一个条件为false,它将false返回到整个if语句。 希望你明白我的意思。
答案 4 :(得分:-1)
在验证第一个字母之前,您将整个字符串转换为大写字母。因此,如果您输入aaaaaa,您将尝试验证AAAAAA