code: private int decodeNumeric( QrCode qr , PackedBits8 data, int bitLocation ) {
  		int lengthBits = QrCodeEncoder.getLengthBitsNumeric(qr.version);
  
  		int length = data.read(bitLocation,lengthBits,true);
  		bitLocation += lengthBits;
  
  		while( length >= 3 ) {
  			if( data.size < bitLocation+10 ) {
  				qr.failureCause = QrCode.Failure.MESSAGE_OVERFLOW;
  				return -1;
  			}
  			int chunk = data.read(bitLocation,10,true);
  			bitLocation += 10;
  
  			int valA = chunk/100;
  			int valB = (chunk-valA*100)/10;
  			int valC = chunk-valA*100-valB*10;
  
  			workString.append((char)(valA + '0'));
  			workString.append((char)(valB + '0'));
  			workString.append((char)(valC + '0'));
  
  			length -= 3;
  		}
  
  		if( length == 2 ) {
  			if( data.size < bitLocation+7 ) {
  				qr.failureCause = QrCode.Failure.MESSAGE_OVERFLOW;
  				return -1;
  			}
  			int chunk = data.read(bitLocation,7,true);
  			bitLocation += 7;
  
  			int valA = chunk/10;
  			int valB = chunk-valA*10;
  			workString.append((char)(valA + '0'));
  			workString.append((char)(valB + '0'));
  		} else if( length == 1 ) {
  			if( data.size < bitLocation+4 ) {
  				qr.failureCause = QrCode.Failure.MESSAGE_OVERFLOW;
  				return -1;
  			}
  			int valA = data.read(bitLocation,4,true);
  			bitLocation += 4;
  			workString.append((char)(valA + '0'));
  		}
  		return bitLocation;
  	}
docs: Decodes a numeric message
  
  @param qr QR code
  @param data encoded data
  @return Location it has read up to in bits