private static final Object number(CharacterIterator it,StringBuilder buf) {
        int length = 0;
        boolean isFloatingPoint = false;
        buf.setLength(0);
        char c = it.current();
        if (c == '-') {
        	buf.append(c);
            c = it.next();
        }
        length += addDigits(it,c,buf);
        if (c == '.') {
        	buf.append(c);
            c = it.next();
            length += addDigits(it,c,buf);
            isFloatingPoint = true;
        }
        if (c == 'e' || c == 'E') {
        	buf.append(c);
            c = it.next();
            if (c == '+' || c == '-') {
            	buf.append(c);
                c = it.next();
            }
            addDigits(it,c,buf);
            isFloatingPoint = true;
        }
 
        String s = buf.toString();
        return isFloatingPoint 
            ? (length < 17) ? (Object)Double.valueOf(s) : new BigDecimal(s)
            : (length < 19) ? (Object)Long.valueOf(s) : new BigInteger(s);
    }