code: public static DPTXlator createTranslator(final int mainNumber, final String dptId) throws KNXException
  	{
  		int main = 0;
  		try {
  			main = getMainNumber(mainNumber, dptId);
  		}
  		catch (final NumberFormatException e) {}
  		final MainType type = map.get(main);
  		if (type == null)
  			throw new KNXException("no DPT translator available for main number " + main + " (ID " + dptId + ")");
  
  		final String id = dptId != null && !dptId.isEmpty() ? dptId : type.getSubTypes().keySet().iterator().next();
  		return type.createTranslator(id);
  	}
docs: Creates a DPT translator for the given datapoint type ID.
  <p>
  The translation behavior of a DPT translator instance is uniquely defined by the supplied datapoint type ID.
  <p>
  If the <code>dptId</code> argument is built up the recommended way, that is "<i>main number</i>.<i>sub number</i>
  ", the <code>mainNumber</code> argument might be left 0 to use the datapoint type ID only.<br>
  Note, that we don't enforce any particular or standardized format on the <code>dptId</code> structure, so using a
  different formatted dptId solely without main number argument results in undefined behavior.
  
  @param mainNumber data type main number, number &ge; 0; use 0 to infer translator type from <code>dptId</code>
  argument only
  @param dptId datapoint type ID for selecting a particular kind of value translation
  @return the new {@link DPTXlator} object
  @throws KNXException on main type not found or creation failed (refer to
  {@link MainType#createTranslator(String)})