;+ ; NAME: ; decstr ; PURPOSE: (one line) ; Convert declination in radians to an ASCII string. ; DESCRIPTION: ; ; CATEGORY: ; Astronomy ; CALLING SEQUENCE: ; decstr, declination, places, str ; INPUTS: ; declination - Declination, in radians, to be converted to a string. May ; a vector, in which case the output will be a vector. ; places - Resolution of output string. ; = -7 nearest hour. +DD ; = -6 nearest 30 minutes. +DD:(00,30) ; = -5 nearest 15 minutes. +DD:(00,15,30,45) ; = -4 nearest 10 minutes. +DD:M0 ; = -3 nearest 5 minutes. +DD:M(0,5) ; = -2 nearest minute. +DD:MM ; = -1 nearest ten seconds. +DD:MM:S0 ; = 0 nearest second. +DD:MM:SS ; = 1 nearest tenth of a second. +DD:MM:SS.s ; = 2 nearest hundredth of a second. +DD:MM:SS.ss ; = 3 nearest thousandth of a second. +DD:MM:SS.sss ; OPTIONAL INPUT PARAMETERS: ; ; KEYWORD PARAMETERS: ; ; OUTPUTS: ; str - Output string for the converted declination. ; COMMON BLOCKS: ; ; SIDE EFFECTS: ; ; RESTRICTIONS: ; ; PROCEDURE: ; Declination (in the range [-pi/2,pi/2]) is converted to a string. ; The sign of the declination is always provided and there are no imbedded ; blanks. PLACES indicates the reported precision of the string. ; Calls external routine radtodms. ; MODIFICATION HISTORY: ; Copyright (C) 1987,91, by Marc W. Buie ; Version dated 91/8/5 ; Ported by Doug Loucks, Lowell Observatory, August 11, 1993, from the ; C-Language version written by Marc Buie. ;- ; ; ------------------------------------------------------------------------------ ; Local procedure d_adjust ; ------------------------------------------------------------------------------ PRO d_adjust, deg, mm i = WHERE( mm EQ 60, count ) IF count NE 0 THEN BEGIN deg[i] = deg[i] + 1 mm[i] = 0 ENDIF END ; ------------------------------------------------------------------------------ ; Local procedure m_adjust ; ------------------------------------------------------------------------------ PRO m_adjust, mm, ss i = WHERE( ss GE 60.0, count ) IF count NE 0 THEN BEGIN mm[i] = mm[i] + 1 ss[i] = 0.0 ENDIF END ; ------------------------------------------------------------------------------ ; Main Procedure decstr ; ------------------------------------------------------------------------------ PRO decstr, declination, places, str IF N_PARAMS() NE 3 THEN BEGIN ; Display the calling sequence. PRINT, 'decstr, declination, places, str' RETURN ENDIF ; Allow declination parameter to be integer, long, float, or double, and ; scalar or vector. IF badpar( declination, [2,3,4,5], [0,1], CALLER='BADPAR ' ) THEN RETURN pi_2 = !dpi / 2.0 ; Initialize the output string to null. str = '' i = WHERE( (declination GT pi_2) OR (declination LT -pi_2), count ) IF count NE 0 THEN BEGIN MESSAGE, 'Declination out of range, |dec| > pi/2.', /INFO RETURN ENDIF ; First, convert to numerical values of degrees, minutes, seconds. radtodms, declination, sgn, dd, mm, ss sign = STRING( FIX( sgn EQ 1 ), FORMAT='(I1)' ) p = WHERE( sign EQ '1', count ) IF count NE 0 THEN sign[p] = '+' n = WHERE( sign EQ '0', count ) IF count NE 0 THEN sign[n] = '-' deg = ABS( dd ) ; This is the big decision table that generates the requested format. CASE places OF -7 : BEGIN ; +DD, Nearest degree. i = WHERE( FLOAT(mm) + ss/60.0 GE 30.0, count ) IF count NE 0 THEN deg[i] = deg[i] + 1 str = sign + STRING( deg, FORMAT='(I2.2)' ) END -6 : BEGIN ; +DD:(00,30), Nearest 30 minutes. mm = nint( ( mm + ss/60.0 ) / 30.0 ) * 30.0 d_adjust, deg, mm str = sign + STRING( deg, FORMAT='(I2.2)' ) + ':' + $ STRING( mm, FORMAT='(I2.2)' ) END -5 : BEGIN ; +DD:(00,15,30,45), Nearest 15 minutes. mm = nint( ( mm + ss/60.0 ) / 15.0 ) * 15.0 d_adjust, deg, mm str = sign + STRING( deg, FORMAT='(I2.2)' ) + ':' + $ STRING( mm, FORMAT='(I2.2)' ) END -4 : BEGIN ; +DD:M0, Nearest 10 minutes. mm = nint( ( mm + ss/60.0 ) / 10.0 ) * 10.0 d_adjust, deg, mm str = sign + STRING( deg, FORMAT='(I2.2)' ) + ':' + $ STRING( mm, FORMAT='(I2.2)' ) END -3 : BEGIN ; +DD:M(0,5), Nearest 5 minutes. mm = nint( ( mm + ss/60.0 ) / 5.0 ) * 5.0 d_adjust, deg, mm str = sign + STRING( deg, FORMAT='(I2.2)' ) + ':' + $ STRING( mm, FORMAT='(I2.2)' ) END -2 : BEGIN ; +DD:MM, Nearest minute. mm = nint( mm + ss/60.0 ) d_adjust, deg, mm str = sign + STRING( deg, FORMAT='(I2.2)' ) + ':' + $ STRING( mm, FORMAT='(I2.2)' ) END -1 : BEGIN ; +DD:MM:S0, Nearest 10 seconds. ss = nint( ss / 10.0 ) * 10.0 d_adjust, mm, ss d_adjust, deg, mm str = sign + STRING( deg, FORMAT='(I2.2)' ) + ':' + $ STRING( mm, FORMAT='(I2.2)' ) + ':' + $ STRING( ss, FORMAT='(I2.2)' ) END 0 : BEGIN ; +DD:MM:SS, Nearest second. ss = nint( ss ) d_adjust, mm, ss d_adjust, deg, mm str = sign + STRING( deg, FORMAT='(I2.2)' ) + ':' + $ STRING( mm, FORMAT='(I2.2)' ) + ':' + $ STRING( ss, FORMAT='(I2.2)' ) END 1 : BEGIN ; +DD:MM:SS.s, Nearest tenth of a second. ss = nint( ss / 0.1 ) * 0.1 ; Save the fractional part of seconds. fss = ss - FIX( ss ) m_adjust, mm, ss d_adjust, deg, mm str = sign + STRING( deg, FORMAT='(I2.2)' ) + ':' + $ STRING( mm, FORMAT='(I2.2)' ) + ':' + $ STRING( ss, FORMAT='(I2.2)' ) + $ STRMID( STRING( fss, FORMAT='(F3.1)' ), 1, 2 ) END 2 : BEGIN ; +DD:MM:SS.ss, Nearest hundredth of a second. ss = nint( ss / 0.01 ) * 0.01 ; Save the fractional part of seconds. fss = ss - FIX( ss ) m_adjust, mm, ss d_adjust, deg, mm str = sign + STRING( deg, FORMAT='(I2.2)' ) + ':' + $ STRING( mm, FORMAT='(I2.2)' ) + ':' + $ STRING( ss, FORMAT='(I2.2)' ) + $ STRMID( STRING( fss, FORMAT='(F4.2)' ), 1, 3 ) END 3 : BEGIN ; +DD:MM:SS.sss, Nearest thousandth of a second. ss = nint( ss / 0.001, /LONG ) * 0.001 ; Save the fractional part of seconds. fss = ss - FIX( ss ) m_adjust, mm, ss d_adjust, deg, mm str = sign + STRING( deg, FORMAT='(I2.2)' ) + ':' + $ STRING( mm, FORMAT='(I2.2)' ) + ':' + $ STRING( ss, FORMAT='(I2.2)' ) + $ STRMID( STRING( fss, FORMAT='(F5.3)' ), 1, 4 ) END ELSE : BEGIN MESSAGE, 'PLACES parameter must be in the range -7 to +3.', /INFO RETURN END ENDCASE END