- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 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;
}
3.14159265 24.09.2014 13:47 # +2
Хороший пример того, как не надо писать утилитные методы.
Такие методы годятся только в утиль.