SUBROUTINE BUILD_PERCENT_STRING(VALUE, MAX_PRECISION, BUFFER) C---------------------------------------------------------------------- C- C- Purpose and Methods : This routine converts a REAL variable to a string. C- It is aimed primarialy at formatting percentages. It is desireable to know C- if, e.g., 100.0% means 100% exactly or 99.99% rounded to one decimal C- place. This routine returns '100.-' if the value would be rounded to 100 C- but is not exact. This routine also returns '0.-' if the value would be C- rounded to 0 but is not exact. Otherwise the parameters are passed on to C- BUILD_REAL_STRING. C- C- Inputs : VALUE The value to convert C- MAX_PRECISION The maximum number of digits after the decimal C- point. C- Outputs : BUFFER The string to store it in. C- Controls: none C- C- Created 30-MAR-1992 Philippe Laurens, Steven Klocek C- Updated 28-JUL-1992 Philippe Laurens, Steven Klocek C- Fix so that code does not blow up when VALUE is too large to C- store in an INTEGER. C- C---------------------------------------------------------------------- IMPLICIT NONE REAL VALUE INTEGER MAX_PRECISION CHARACTER*(*) BUFFER C INTEGER SLENGTH INTEGER ROUNDED_VALUE LOGICAL EQ_100 REAL TEST_VALUE INTEGER POS C C This is the declaration for an inline function to implement a test C to see if the percentage should be flagged as exactly "100" (as opposed C to "almost 100" shown as 100.0). We are trying to see if exactly ALL C crossings found the quantity asserted or negated. For a 5s increment we C have (5 / 3.5E-6) ~ 1 million crossings. C We are thus discriminating against one part in 10^6 EQ_100(TEST_VALUE) = ( (TEST_VALUE - 100.0) .LE. 0.5E-4 ) C C ---------------------------------------------------------------------- C IF (MAX_PRECISION .LT. 0) GOTO 200 IF (MAX_PRECISION .GE. 9) GOTO 200 C SLENGTH = LEN(BUFFER) C IF (ABS(VALUE * 10**MAX_PRECISION) .GT. 2147483640) GOTO 200 ROUNDED_VALUE = NINT(VALUE * 10**MAX_PRECISION) C IF ((ROUNDED_VALUE .NE. 100* 10**MAX_PRECISION) & .AND. (ROUNDED_VALUE .NE. 0)) THEN CALL BUILD_REAL_STRING(VALUE, MAX_PRECISION, BUFFER) GOTO 999 ENDIF C BUFFER = ' ' C IF ((ROUNDED_VALUE .EQ. 100* 10**MAX_PRECISION) & .AND. (EQ_100(VALUE) )) THEN IF (SLENGTH .LT. 3) GOTO 200 POS = MAX(1, SLENGTH-3-MAX_PRECISION) BUFFER(POS:POS+2) = '100' GOTO 999 ENDIF C IF ((ROUNDED_VALUE .EQ. 0) & .AND. (VALUE .EQ. SNGL(0.))) THEN IF (SLENGTH .LT. 2) GOTO 200 POS = MAX(1, SLENGTH-1-MAX_PRECISION) BUFFER(POS:POS) = '0' GOTO 999 ENDIF C CALL BUILD_REAL_STRING(VALUE, MAX_PRECISION, BUFFER) GOTO 999 C C Handle Error C 200 CONTINUE CALL STR$DUPL_CHAR(BUFFER, SLENGTH, ICHAR('*')) IF (VALUE .LT. 0) BUFFER(1:1) = '-' C---------------------------------------------------------------------- 999 RETURN END