簡體   English   中英

使用 Scanner 驗證字符串是否為空並將空字符串作為有效值返回

[英]Validate is a string is empty using Scanner and return the empty string as valid value

我使用 Java 中的 Scanner 來獲取用戶條目,例如姓名、電子郵件和電話。 姓名和姓氏是必需的,但電子郵件和電話不是必需的,用戶只需按回車鍵即可將它們留空。

這是我用來驗證每個條目的長度並在長度低於或高於 lngMin 或 lngMax 時顯示錯誤消息的方法。

public static String validateString (String msgSoll, String msgErr, 
               int lngMin, int lngMax) {
          String myString = null;
          
          if (lngMin >= 0 && lngMax >= lngMin) {
             do {
                System.out.print(msgSoll);
                myString = myScanner.nextLine();
                if (myString.length() < lngMin || myString.length() > lngMax) {
                   System.out.println(msgErr);
                }
             } while (myString.length() < lngMin || myString.length() > lngMax);
          }
          return myString;
       }

我有這個方法來驗證電子郵件,我調用了 validateString 方法和其他方法來驗證電子郵件是否包含至少 1 個點和一個 @ 以及特殊字符和數字字符。 在這種方法中,我想驗證電子郵件是否為空,以及是否返回空電子郵件作為有效值。

public static String validateEmail() {
        String email = null;
        String validEmail = null;
        boolean isAlpha = false;

            do {

                email = validateString(MSG_SOLL_COURRIEL, MSG_ERR_COURRIEL, 5, 50);

                isAlpha = Tp2Utils.isAlphaNumPlus(email, "@,.,_") && Tp2Utils.hasNChar(email, '.') >= 1 && Tp2Utils.hasNChar(email, '@') == 1;


                    if (isAlpha) {
                        validEmail = email;
                    }


            } while (!isAlpha);

        return validEmail;
}

我有這種方法來驗證電話,其中我使用了一種方法來驗證 tel 是否僅包含數字字符。 在該方法中,我還需要驗證 tel 是否為空,如果是這種情況,則將空 tel 作為有效值返回。

 public static String validateTel() {
    
            boolean telValid = false;
    
            String tel = null;
            String telVal;
    
            do {
    
                tel = validateString(MSG_SOLL_TEL, MSG_ERR_TEL, 10, 10);
    
                telValid = Tp2Utils.containsOnlyNums(tel);
    
    
            } while (!telValide);
    
            telVal = tel;
    
            return telVal;  
        }

如果有人可以幫助我解決驗證問題,我將不勝感激。

謝謝

更新(感謝Joakim Danielson ):

雖然添加了新參數, boolean mandatory lngMin會保持代碼不那么混亂和干凈,但即使處理lngMin的值也可以解決這個問題

public static String validateString (String msgSoll, String msgErr, int lngMin, int lngMax) {
    String myString = null;

    if (lngMin >= 0 && lngMax >= lngMin) {
        do {
            System.out.print(msgSoll);
            myString = myScanner.nextLine();

            // Return a blank string if the min required length is 0
            if (lngMin == 0 && myString.isBlank()) {
                return myString;
            }

            if (myString.length() < lngMin || myString.length() > lngMax) {
                System.out.println(msgErr);
            }
        } while (myString.length() < lngMin || myString.length() > lngMax);
    }

    return myString;
}

然后,你稱之為

public static String validateEmail() {
    String email = null;
    String validEmail = null;
    boolean isAlpha = false;

    do {
        email = validateString(MSG_SOLL_COURRIEL, MSG_ERR_COURRIEL, 0, 50);
        if (email.isBlank()) {
            return email;// Return blank
        }
        isAlpha = Tp2Utils.isAlphaNumPlus(email, "@,.,_") && Tp2Utils.hasNChar(email, '.') >= 1 && Tp2Utils.hasNChar(email, '@') == 1;
        if (isAlpha) {
            validEmail = email;
        }
    } while (!isAlpha);

    return validEmail;
}

原答案:

您可以在方法簽名中放置一個布爾參數,例如boolean mandatory 如果為此參數傳遞false ,則該方法應返回一個空字符串,以防用戶按Enter 鍵而不輸入任何值。

public static String validateString (String msgSoll, String msgErr, int lngMin, int lngMax, boolean mandatory) {
    String myString = null;

    if (lngMin >= 0 && lngMax >= lngMin) {
        do {
            System.out.print(msgSoll);
            myString = myScanner.nextLine();

            // Return a blank string if not mandatory
            if (!mandatory && myString.isBlank()) {
                return myString;
            }

            if (myString.length() < lngMin || myString.length() > lngMax) {
                System.out.println(msgErr);
            }
        } while (myString.length() < lngMin || myString.length() > lngMax);
    }

    return myString;
}

然后,你稱之為

public static String validateEmail() {
    String email = null;
    String validEmail = null;
    boolean isAlpha = false;

    do {
        email = validateString(MSG_SOLL_COURRIEL, MSG_ERR_COURRIEL, 5, 50, false);
        if (email.isBlank()) {
            return email;// Return blank
        }
        isAlpha = Tp2Utils.isAlphaNumPlus(email, "@,.,_") && Tp2Utils.hasNChar(email, '.') >= 1 && Tp2Utils.hasNChar(email, '@') == 1;
        if (isAlpha) {
            validEmail = email;
        }
    } while (!isAlpha);

    return validEmail;
}

完整的解決方案:

public class Main {


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String name = getValidatedField(in, "Enter your name: ", Validators.NAME_VALIDATOR);
        String surname = getValidatedField(in, "Enter your surname: ", Validators.NAME_VALIDATOR);
        String email = getValidatedField(in, "Enter your email: ", Validators.EMAIL_VALIDATOR);
        String phone = getValidatedField(in, "Enter your phone: ", Validators.PHONE_VALIDATOR);

        // process your validated fields here
    }

    private static String getValidatedField(Scanner in, String message, Function<String, ValidationResult> validationRule) {
        ValidationResult validationResult;
        String input;
        do {
            System.out.println(message);
            input = in.nextLine();
            validationResult = validationRule.apply(input);
            System.out.println(validationResult.getMessage());
        } while (!validationResult.isSuccess());
        return input;
    }
}

class Validators {
    private static final String WRONG_LENGTH_MSG = "Invalid length.";
    private static final String WRONG_FORMAT_MSG = "Wrong format.";
    private static final String EMAIL_PATTERN = "(^$|^[A-Za-z0-9]+@[A-Za-z0-9]+\\.[A-Za-z]+$)";
    private static final String NAME_PATTERN = "^[A-Za-z ,.'-]*$";
    private static final String ONLY_NUMBERS_PATTERN = "^[0-9]*$";

    private static boolean checkMinMaxLength(final String input, int min, int max) {
        int length = input.length();
        return length < min || length > max;
    }

    public static Function<String, ValidationResult> NAME_VALIDATOR = input ->
    {
        final ValidationResult result;
        if (checkMinMaxLength(input, 1, 10)) {
            result = ValidationResult.failure().message(WRONG_LENGTH_MSG);
        } else if (!input.matches(NAME_PATTERN)) {
            result = ValidationResult.failure().message(WRONG_FORMAT_MSG);
        } else {
            result = ValidationResult.success();
        }
        return result;
    };

    public static Function<String, ValidationResult> PHONE_VALIDATOR = input ->
    {
        final ValidationResult result;
        if (!StringUtils.isBlank(input)) {
            if (checkMinMaxLength(input, 2, 11)) {
                result = ValidationResult.failure().message(WRONG_LENGTH_MSG);
            } else if (!input.matches(ONLY_NUMBERS_PATTERN)) {
                result = ValidationResult.failure().message(WRONG_FORMAT_MSG);
            } else {
                result = ValidationResult.success();
            }
        } else {
            result = ValidationResult.success();
        }
        return result;
    };

    public static Function<String, ValidationResult> EMAIL_VALIDATOR = input ->
    {
        final ValidationResult result;
        if (!StringUtils.isBlank(input)) {
            if (checkMinMaxLength(input, 4, 20)) {
                result = ValidationResult.failure().message(WRONG_LENGTH_MSG);
            } else if (!input.matches(EMAIL_PATTERN)) {
                result = ValidationResult.failure().message(WRONG_FORMAT_MSG);
            } else {
                result = ValidationResult.success();
            }
        } else {
            result = ValidationResult.success();
        }
        return result;
    };


    private Validators() {
    }
}

class ValidationResult {
    private static final String OK_MSG = "OK";
    private final boolean success;
    private String message;

    public ValidationResult(boolean success) {
        this.success = success;
    }

    public ValidationResult(boolean success, String message) {
        this.success = success;
        this.message = message;
    }

    public static ValidationResult success() {
        return new ValidationResult(Boolean.TRUE, OK_MSG);
    }

    public static ValidationResult failure() {
        return new ValidationResult(Boolean.FALSE);
    }

    public ValidationResult message(String message) {
        this.message = message;
        return this;
    }

    public boolean isSuccess() {
        return success;
    }

    public String getMessage() {
        return message;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM