30/09/2018, 23:09

Hàm chỉ cho phép nhập số

Mình có hàm kiểm tra chỉ cho nhập số trong swing ntn. Khi chạy đáng ra kết quả là false, nhưng lại ra true. Các bác xem hộ sai ở đâu ạ

 private static int[] number = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

 public static boolean checkNumber(String s) {
        boolean check = false;
        char[] a = s.toCharArray();
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
            for (int j = 0; j < number.length; j++) {
                if (a[i] != number[j]) {
                    check = true;
                }
            }
        }
        return check;
    }
    public static void main(String[] args) {
        boolean check = checkNumber("123");
        System.out.println(check);
    }
*grab popcorn* viết 01:14 ngày 01/10/2018

Vì bạn quên break và đặt lại kết quả.
Như khi chuỗi này abcdef123abc
Thì mới đầu biến check sẽ là true.
Tuy nhiên gặp ký tự số nó vẫn là true vì bạn chưa chỉnh lại.
Nhưng nếu có chỉnh lại và chạy tiếp tới gặp abc thì nó lại set check lại = true tiếp
-> Sai
Vậy nên bạ nchir cần sửa lại một chút thành như thế này.
if(a[i] == number[i]) {
return false; //return luôn khỏi check chiết gì nữa. Vì nó đã sai rồi
}

Đỗ Trung Quân viết 01:20 ngày 01/10/2018

Bó tay với bạn. Nếu số đầu tiên nó đúng thì return luôn chứ làm sao mà kiểm tra tiếp các số sau đc. Mà có kiểm tra được tiếp thì nó cũng sẽ không bao giờ so sánh ra kết quả true khi a là mảng char còn number là mảng int.
Cơ bản cách tiếp cận để giải bài này đã không đúng

*grab popcorn* viết 01:26 ngày 01/10/2018

A có thể nói rõ hơn không?
Vì e ko hiểu a nói gì???

Đỗ Trung Quân viết 01:25 ngày 01/10/2018

Điều kiện if sai. Đọc comment của Voodoo là em hiểu.

anonymous152 viết 01:19 ngày 01/10/2018

Đối với loại bài này bạn nên sử dụng biểu thức chính quy( regular expression ) + bắt sự kiện khi nhập vào bạn nhé.

Demon Hunter viết 01:11 ngày 01/10/2018
public static boolean checkNumber(String str) {
            if (str == null || str.isEmpty()) {
                return false;
            }
            int sz = str.length();
            for (int i = 0; i < sz; i++) {
                if (!Character.isDigit(str.charAt(i)) ) {
                    return false;
                }
            }
            return true;
 }

checkNumber(null) = false
checkNumber("") = false
checkNumber(" “) = false
checkNumber(“123”) = true
checkNumber(“12 3”) = false
checkNumber(“ab2c”) = false
checkNumber(“12-3”) = false
checkNumber"12.3”) = false

Vậy thôi.

Đỗ Trung Quân viết 01:09 ngày 01/10/2018

checkNumber"12.3") = fals

Cái này phải đúng chứ.
Code của bạn vẫn chưa đủ.
-123.123

Nguyen Ca viết 01:23 ngày 01/10/2018

Nếu tác giả chỉ muốn bắt số nguyên thì cách này cũng ok. còn nếu mà có cái decimal, chắc dùng cái parse (float, double) rồi bắt exception cho nhanh nhỉ.

Đỗ Trung Quân viết 01:12 ngày 01/10/2018

Số nguyên âm không đúng

*grab popcorn* viết 01:20 ngày 01/10/2018

À à =))
Chỉ cho phép đọc số, e đọc nhầm thành không cho phép đọc số.
Hèn gì…

Demon Hunter viết 01:21 ngày 01/10/2018

@qtd top chỉ check từ 0-9 mà. Muốn check luôn decimal, nguyên âm luôn.

public static boolean checkNumber(String str) {
	if (str == null || str.isEmpty()) {
		return false;
	}

	boolean hasExp = false;
	boolean hasDecPoint = false;
	boolean allowSigns = false;
	boolean foundDigit = false;
	char[] chars = str.toCharArray();
	int sz = chars.length;
	int start = (chars[0] == '-') ? 1 : 0;
	if (sz > start + 1) {
		if (chars[start] == '0' && chars[start + 1] == 'x') {
			int i = start + 2;
			if (i == sz) {
				return false;
			}

			for (; i < chars.length; i++) {
				if ((chars[i] < '0' || chars[i] > '9') && (chars[i] < 'a' || chars[i] > 'f') && (chars[i] < 'A' || chars[i] > 'F')) {
					return false;
				}
			}
			return true;
		}
	}
	sz--;

	int i = start;
	while (i < sz || (i < sz + 1 && allowSigns && !foundDigit)) {
		if (chars[i] >= '0' && chars[i] <= '9') {
			foundDigit = true;
			allowSigns = false;

		} else if (chars[i] == '.') {
			if (hasDecPoint || hasExp) {
				return false;
			}
			hasDecPoint = true;
		} else if (chars[i] == 'e' || chars[i] == 'E') {
			if (hasExp) {
				return false;
			}
			if (!foundDigit) {
				return false;
			}
			hasExp = true;
			allowSigns = true;
		} else if (chars[i] == '+' || chars[i] == '-') {
			if (!allowSigns) {
				return false;
			}
			allowSigns = false;
			foundDigit = false;
		} else {
			return false;
		}
		i++;
	}

	if (i < chars.length) {
		if (chars[i] >= '0' && chars[i] <= '9') {
			return true;
		}
		if (chars[i] == 'e' || chars[i] == 'E') {
			return false;
		}
		if (!allowSigns && (chars[i] == 'd' || chars[i] == 'D' || chars[i] == 'f' || chars[i] == 'F')) {
			return foundDigit;
		}
		if (chars[i] == 'l' || chars[i] == 'L') {
			return foundDigit && !hasExp;
		}
		return false;
	}

	return !allowSigns && foundDigit;
}
Đỗ Trung Quân viết 01:24 ngày 01/10/2018

Không biết bạn có hiểu code không nữa khi bạn đi copy chỗ khác. Nhưng mình thấy thừa, như này có lẽ là đủ rồi

 public static boolean checkNumber(String str) {
      int countDot = 0;
      if (str == null || str.isEmpty()) {
        return false;
      }
      for(int i = 0 ; i<str.length(); i++){
          if(str.charAt(i) == '-' && i > 0){
              return false;
          }
          if(str.charAt(i) == '.' && i == 0){
              return false;
          }
          if(str.charAt(i) == '.' && i == str.length()-1){
              return false;
          }
          if(Character.isAlphabetic(str.charAt(i))){
              return false;
          }
          //count operation ,
          if(str.charAt(i) == '.'){
              ++countDot;
              if(countDot > 1){
                  return false;
              }
          }
       }
      return true;
  }
*grab popcorn* viết 01:24 ngày 01/10/2018

Sao ko ai dùng regular expression nhỉ??

Đỗ Trung Quân viết 01:21 ngày 01/10/2018

Kể cả không cho phép đọc số thì em làm vậy vẫn sai. Không thể so sánh như vậy. Kết quả if luôn trả về false mà. Giống như Joe nói
Mảng số int Decimal giá trị 1 có index 0001 cột hexa bảng mã ASCII. Còn character ‘1’ ở vị trí 31. Lúc so sánh 01 không thể bằng 31

*grab popcorn* viết 01:13 ngày 01/10/2018

:)) e biết rồi, em bị nhầm 2 cái là
1/ hàm ko cho phép đọc số
2/ mảng kia là mảng ký tự đc init bởi các ký tự số (‘0’, ‘1’…).

Và như e hỏi ở trên. Sao mình ko dùng regex nhỉ :?

Đỗ Trung Quân viết 01:21 ngày 01/10/2018

Tùy thôi. Ai muốn dùng thế nào thì dùng. Với anh thì cái nào dễ hơn thì làm.
@Voodoo. Which way u do in this case? TryParse or regex and Why?

Demon Hunter viết 01:16 ngày 01/10/2018

Bạn vẫn chưa hiểu chỗ nào mình sẽ giải thích cho bạn? Code trên có gì đâu mà kêu không hiểu? Nó quá dài và check tất cả các trường hợp? Dù có copy code hay lấy ở đâu, nhưng nó vẫn là giải pháp tốt. Bạn thử dùng code của bạn check xem check được các định dạng này không?
checkNumber("-10f"), checkNumber("-10d")

Demon Hunter viết 01:13 ngày 01/10/2018

Regular expression check đơn giản hơn nhưng performance không tốt, trừ khi check phức tạp quá thì dùng thôi, theo mình thì nên hạn chế.

viết 01:16 ngày 01/10/2018

nếu check số thực thì xài parseDouble cho chắc. Còn số nguyên thì có thể viết hàm tự chế hoặc xài parseInt cho khỏe luôn.

public static Integer stoi(String str) {
    try {
        return Integer.parseInt(str);
    } catch (NumberFormatException e) {
        return null;
    }
}

public static Double stod(String str) {
    try {
        return Double.parseDouble(str);
    } catch (NumberFormatException e) {
        return null;
    }
}

có vài cái “lạ” khi xài parseDouble http://rextester.com/SGYSC83641

          "123" is int: true
         "-123" is int: true
         "+123" is int: true
        "--123" is int: false
        "++123" is int: false
         "0123" is int: true
        "0x123" is int: false
         "12.3" is int: false
        "-12.3" is int: false
         "12a3" is int: false
         "12 3" is int: false
         " 123" is int: false
        "- 123" is int: false
         "123 " is int: false
        "-123 " is int: false
        " -123" is int: false
         "12e3" is int: false
        "1.2e3" is int: false
       "-1.2e3" is int: false
      "-1.2e-3" is int: false
   "1234567890" is int: true
  "12345678901" is int: false

          "123" is double: true
         "-123" is double: true
         "+123" is double: true
        "--123" is double: false
        "++123" is double: false
         "0123" is double: true
        "0x123" is double: false
         "12.3" is double: true
        "-12.3" is double: true
         "12a3" is double: false
         "12 3" is double: false
         " 123" is double: true
        "- 123" is double: false
         "123 " is double: true
        "-123 " is double: true
        " -123" is double: true
         "12e3" is double: true
        "1.2e3" is double: true
       "-1.2e3" is double: true
      "-1.2e-3" is double: true
   "1234567890" is double: true
  "12345678901" is double: true
Bài liên quan
0