Jawa / Говнокод #16759 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
static final String MIN_INTEGER = String.valueOf(Integer.MIN_VALUE);
  static final String MAX_INTEGER = String.valueOf(Integer.MAX_VALUE);
  static final String MIN_LONG = String.valueOf(Long.MIN_VALUE);
  static final String MAX_LONG = String.valueOf(Long.MAX_VALUE);

  static final int NS_INTEGER = 1;
  static final int NS_LONG = 2;

  /**
   * Проверяет, является ли передаваемая строка строковым представлением числа типа int (long)
   * @param s строка для проверки
   * @return <code>true</code>, если строка может быть распарсена как int (ling).
   * @see Integer#parseInt
   * @see Long#parseLong
   */
  private static boolean isNumber(String s, int NUMBER_SIZE) {
    String MIN_NUMBER = "", MAX_NUMBER = "";
    switch (NUMBER_SIZE) {
      case (NS_INTEGER):
        MIN_NUMBER = MIN_INTEGER;
        MAX_NUMBER = MAX_INTEGER;
      break;
      case (NS_LONG):
        MIN_NUMBER = MIN_LONG;
        MAX_NUMBER = MAX_LONG;
      break;
    }
    if (s == null) return false;
    final int len = s.length();
    boolean negative = false;
    int pos = len > 0 && (negative = s.charAt(0) == '-') ? 1 : 0;
    if (pos == len) return false;
    while (pos < len && s.charAt(pos) == '0') pos++; //пропустим 0
    if (pos == len) return true; // там 0
    // если длина заведомо больше, то и значение по-любому выходит за пределы
    if (negative && len - pos > MIN_NUMBER.length() - 1 || len - pos > MAX_NUMBER.length()) return false;
    // нужно проверять предельные значения
    boolean needCheckRange = negative && len - pos == MIN_NUMBER.length() - 1 || len - pos == MAX_NUMBER.length();
    if (needCheckRange) {
      final String rangeString = negative ? MIN_NUMBER : MAX_NUMBER;
      for (int i = negative? 1:0; pos<len; pos++,i++) {
        final char c = s.charAt(pos);
        char r = 0;
        if (c < '0' || c > '9' ||
            (needCheckRange && c > (r = rangeString.charAt(i))) ||
            ((needCheckRange &= c == r) && false))
          return false;
      }
    } else {
      for (;pos<len;pos++) {
        final char c = s.charAt(pos);
        if (c < '0' || c > '9')
          return false;
      }
    }
    return true;
  }

Запостил: glprizes glprizes, (Updated )

Комментарии (1) RSS

  • isNumber("12345", 3)
    Хороший пример того, как не надо писать утилитные методы.
    Такие методы годятся только в утиль.
    Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8