Я пытаюсь создать программу, которая проверяет, действительно ли серийные коды пользователя действительны или нет. Он должен соответствовать определенному формату. Формат должен состоять из двух цифр, за ними следует тире, четыре цифры, точка, затем четыре цифры и два символа (примечание: принятые символы - только a, b и c).Заполнение определенного строкового формата нулями, если он меньше требуемой длины
Example valid format:
31-0001.2341ac
00-9999.0001cb
Если серийный код является недействительным, поскольку он не соответствует требуемой длины строки, программа должна заполнить его нулями в начале и новый код будет напечатан.
Мне удалось работать с программой проверки серийного кода с использованием регулярных выражений, теперь она корректно проверяет, является ли код действительным или нет. Тем не менее, я считаю это сложным, когда ему нужно создать новый код для недопустимого серийного кода. Это все равно, что мне нужен жесткий код для всех возможных комбинаций.
Я пробовал следовать этому How to format a Java string with leading zero?, но мне тяжело, потому что в моем строковом формате есть черточка & в середине строки.
Я все еще довольно новый, я еще не знаком с utils или библиотеками для таких функций. Я надеюсь, что кто-то может помочь мне исправить мой код, чтобы сделать его более простым и эффективным.
import java.util.Scanner;
public class SerialCheck {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("How many serial numbers would you like to check: ");
int length = sc.nextInt();
int valid = 0;
String[] sSerials = new String[length];
for (int nCtr = 0; nCtr < length; nCtr++) {
System.out.print("Enter Serial " + (nCtr + 1) + ": ");
sSerials[nCtr] = sc.next();
}
System.out.println();
System.out.println("The following were added: ");
for (int nCtr = 0; nCtr < length; nCtr++) {
System.out.println(sSerials[nCtr]);
}
System.out.println();
System.out.println("Comments\t" + "New Code");
for (int nCtr = 0; nCtr < length; nCtr++) {
boolean isValid = sSerials[nCtr].matches("[0-9]{2}-[0-9]{4}\\.[0-9]{4}[abc0-9]{2}");
boolean isMissing = sSerials[nCtr].matches("[0-9]{2}-[0-9]{4}\\.[0-9]{1}[abc0-9]{2}") ||
sSerials[nCtr].matches("[0-9]{2}-[0-9]{4}\\.[0-9]{2}[abc0-9]{2}") ||
sSerials[nCtr].matches("[0-9]{2}-[0-9]{4}\\.[0-9]{3}[abc0-9]{2}");
boolean isMissing1 = sSerials[nCtr].matches("[0-9]{2}-[0-9]{1}\\.[0-9]{4}[abc0-9]{2}") ||
sSerials[nCtr].matches("[0-9]{2}-[0-9]{2}\\.[0-9]{4}[abc0-9]{2}") ||
sSerials[nCtr].matches("[0-9]{2}-[0-9]{3}\\.[0-9]{4}[abc0-9]{2}");
boolean isMissing2 = sSerials[nCtr].matches("[0-9]{0}-[0-9]{4}\\.[0-9]{4}[abc0-9]{2}") ||
sSerials[nCtr].matches("[0-9]{1}-[0-9]{4}\\.[0-9]{4}[abc0-9]{2}");
if (isValid) {
System.out.println("Valid\t\t" + sSerials[nCtr]);
} else if (isMissing) {
System.out.println("Invalid\t\t" + sSerials[nCtr].substring(0, 8) + "0000".substring(0, 14 - sSerials[nCtr].length()) + sSerials[nCtr].substring(8));
} else if (isMissing1) {
System.out.println("Invalid\t\t" + sSerials[nCtr].substring(0, 3) + "0000".substring(0, 14 - sSerials[nCtr].length()) + sSerials[nCtr].substring(3));
} else if (isMissing2) {
System.out.println("Invalid\t\t" + sSerials[nCtr].substring(0, 0) + "00".substring(0, 14 - sSerials[nCtr].length()) + sSerials[nCtr].substring(0));
} else {
System.out.println("Invalid\t");
}
}
}
}
@Andrew быстрый вопрос для уточнения требований. Если кто-то вводит неверный серийный '2341ac', вы хотите, чтобы ваша программа генерировала' 00-0000.2341ac', '000000002341ac' или что-то еще? Кроме того, если бы вы могли точно сформулировать вопрос, это помогло бы мне кратко ответить. Я думаю, что получаю то, о чем вы просите, но я хочу проверить. – entpnerd
@entpnerd, если они вводят 2341ac, это должно быть 00-0000.2341ac – Andrew
В настоящее время, как работает моя программа, я пытаюсь найти все возможные комбинации, где пользователь может пропустить цифру на любой части строки и просто просто заполнить ее нулями в начале. Поэтому Im просто ищет другое решение, чтобы упростить его. – Andrew