docs: private LitDouble number(Data data) throws TemplateException {
  	// check first character is a number literal representation
  	if (!(data.srcCode.isCurrentBetween('0', '9') || data.srcCode.isCurrent('.'))) return null;
  
  	Position line = data.srcCode.getPosition();
  	StringBuffer rtn = new StringBuffer();
  
  	// get digit on the left site of the dot
  	if (data.srcCode.isCurrent('.')) rtn.append('0');
  	else rtn.append(digit(data));
  	// read dot if exist
  	if (data.srcCode.forwardIfCurrent('.')) {
  	    rtn.append('.');
  	    String rightSite = digit(data);
  	    if (rightSite.length() > 0 && data.srcCode.forwardIfCurrent('e')) {
  		Boolean expOp = null;
  		if (data.srcCode.forwardIfCurrent('+')) expOp = Boolean.TRUE;
  		else if (data.srcCode.forwardIfCurrent('-')) expOp = Boolean.FALSE;
  
  		if (data.srcCode.isCurrentBetween('0', '9')) {
  		    if (expOp == Boolean.FALSE) rightSite += "e-";
  		    else if (expOp == Boolean.TRUE) rightSite += "e+";
  		    else rightSite += "e";
  		    rightSite += digit(data);
  		}
  		else {
  		    if (expOp != null) data.srcCode.previous();
  		    data.srcCode.previous();
  		}
  	    }
  	    // read right side of the dot
  	    if (rightSite.length() == 0) rightSite = "0";// throw new TemplateException(cfml, "Number can't end with [.]"); // DIFF 23
  	    rtn.append(rightSite);
  	}
  	// scientific notation
  	else if (data.srcCode.forwardIfCurrent('e')) {
  	    Boolean expOp = null;
  	    if (data.srcCode.forwardIfCurrent('+')) expOp = Boolean.TRUE;
  	    else if (data.srcCode.forwardIfCurrent('-')) expOp = Boolean.FALSE;
  
  	    if (data.srcCode.isCurrentBetween('0', '9')) {
  		String rightSite = "e";
  		if (expOp == Boolean.FALSE) rightSite += "-";
  		else if (expOp == Boolean.TRUE) rightSite += "+";
  		rightSite += digit(data);
  		rtn.append(rightSite);
  	    }
  	    else {
  		if (expOp != null) data.srcCode.previous();
  		data.srcCode.previous();
  	    }
  	}
  	comments(data);
  
  	try {
  	    return data.factory.createLitDouble(Caster.toDoubleValue(rtn.toString()), line, data.srcCode.getPosition());
  	}
  	catch (CasterException e) {
  	    throw new TemplateException(data.srcCode, e.getMessage());
  	}
  
      }