def getFormattedResult(self, specs=None, decimalmark='.', sciformat=1, html=True): """Formatted result: 1. If the result is a detection limit, returns '< LDL' or '> UDL' 2. Print ResultText of matching ResultOptions 3. If the result is not floatable, return it without being formatted 4. If the analysis specs has hidemin or hidemax enabled and the result is out of range, render result as '<min' or '>max' 5. If the result is below Lower Detection Limit, show '<LDL' 6. If the result is above Upper Detecion Limit, show '>UDL' 7. Otherwise, render numerical value :param specs: Optional result specifications, a dictionary as follows: {'min': <min_val>, 'max': <max_val>, 'error': <error>, 'hidemin': <hidemin_val>, 'hidemax': <hidemax_val>} :param decimalmark: The string to be used as a decimal separator. default is '.' :param sciformat: 1. The sci notation has to be formatted as aE^+b 2. The sci notation has to be formatted as a·10^b 3. As 2, but with super html entity for exp 4. The sci notation has to be formatted as a·10^b 5. As 4, but with super html entity for exp By default 1 :param html: if true, returns an string with the special characters escaped: e.g: '<' and '>' (LDL and UDL for results like < 23.4). """ result = self.getResult() # 1. The result is a detection limit, return '< LDL' or '> UDL' dl = self.getDetectionLimitOperand() if dl: try: res = float(result) # required, check if floatable res = drop_trailing_zeros_decimal(res) fdm = formatDecimalMark(res, decimalmark) hdl = cgi.escape(dl) if html else dl return '%s %s' % (hdl, fdm) except (TypeError, ValueError): logger.warn( "The result for the analysis %s is a detection limit, " "but not floatable: %s" % (self.id, result)) return formatDecimalMark(result, decimalmark=decimalmark) choices = self.getResultOptions() # 2. Print ResultText of matching ResulOptions match = [x['ResultText'] for x in choices if str(x['ResultValue']) == str(result)] if match: return match[0] # 3. If the result is not floatable, return it without being formatted try: result = float(result) except (TypeError, ValueError): return formatDecimalMark(result, decimalmark=decimalmark) # 4. If the analysis specs has enabled hidemin or hidemax and the # result is out of range, render result as '<min' or '>max' specs = specs if specs else self.getResultsRange() hidemin = specs.get('hidemin', '') hidemax = specs.get('hidemax', '') try: belowmin = hidemin and result < float(hidemin) or False except (TypeError, ValueError): belowmin = False try: abovemax = hidemax and result > float(hidemax) or False except (TypeError, ValueError): abovemax = False # 4.1. If result is below min and hidemin enabled, return '<min' if belowmin: fdm = formatDecimalMark('< %s' % hidemin, decimalmark) return fdm.replace('< ', '< ', 1) if html else fdm # 4.2. If result is above max and hidemax enabled, return '>max' if abovemax: fdm = formatDecimalMark('> %s' % hidemax, decimalmark) return fdm.replace('> ', '> ', 1) if html else fdm # Below Lower Detection Limit (LDL)? ldl = self.getLowerDetectionLimit() if result < ldl: # LDL must not be formatted according to precision, etc. # Drop trailing zeros from decimal ldl = drop_trailing_zeros_decimal(ldl) fdm = formatDecimalMark('< %s' % ldl, decimalmark) return fdm.replace('< ', '< ', 1) if html else fdm # Above Upper Detection Limit (UDL)? udl = self.getUpperDetectionLimit() if result > udl: # UDL must not be formatted according to precision, etc. # Drop trailing zeros from decimal udl = drop_trailing_zeros_decimal(udl) fdm = formatDecimalMark('> %s' % udl, decimalmark) return fdm.replace('> ', '> ', 1) if html else fdm # Render numerical values return format_numeric_result(self, self.getResult(), decimalmark=decimalmark, sciformat=sciformat)