1. Java / Говнокод #16759

    +76

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 24 Сентября 2014

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

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

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