def degDMS(deg, prec=6, s_D=S_DEG, s_M=S_MIN, s_S=S_SEC, neg='-', pos=''): '''Convert degrees to a string in degrees, minutes I{or} seconds. @param deg: Value in degrees (C{scalar}). @keyword prec: Optional number of decimal digits (0..9 or C{None} for default). Trailing zero decimals are stripped for I{prec} values of 1 and above, but kept for negative I{prec} values. @keyword s_D: Symbol for degrees (C{str}). @keyword s_M: Symbol for minutes (C{str}) or C{""}. @keyword s_S: Symbol for seconds (C{str}) or C{""}. @keyword neg: Optional sign for negative ('-'). @keyword pos: Optional sign for positive (''). @return: I{Either} degrees, minutes I{or} seconds (C{str}). ''' d, s = abs(deg), s_D if d < 1: if s_M: d *= 60 if d < 1 and s_S: d *= 60 s = s_S else: s = s_M elif s_S: d *= 3600 s = s_S n = neg if deg < 0 else pos z = int(prec) t = '%s%.*f' % (n, abs(z), d) if z > 1: t = fStrzs(t) return t + s
def _toDMS(deg, form, prec, sep, ddd): '''(INTERNAL) Convert degrees to string, without sign or suffix. ''' try: d = abs(float(deg)) except ValueError: raise ValueError('%s invalid: %r' % ('deg', deg)) if prec is None: z = p = _F_prec.get(form, 6) else: z = int(prec) p = abs(z) w = p + (1 if p else 0) f = form.lower() if f in (F_DEG, F_MIN, F_SEC): s_deg = s_min = s_sec = '' # no symbols else: s_deg, s_min, s_sec = S_DEG, S_MIN, S_SEC if f in (F_D, F_DEG, 'degrees'): # deg°, degrees t = '%0*.*f' % (ddd+w,p,d) s = s_deg elif f in (F_RAD, 'radians'): t = '%.*f' % (p,radians(d)) s = S_RAD elif f in (F_DM, F_MIN, 'deg+min'): d, m = divmod(d * 60, 60) t = "%0*d%s%s%0*.*f" % (ddd,int(d),s_deg, sep, w+2,p,m) s = s_min else: # F_DMS, F_SEC, 'deg+min+sec' d, s = divmod(d * 3600, 3600) m, s = divmod(s, 60) t = "%0*d%s%s%02d%s%s%0*.*f" % (ddd,int(d),s_deg, sep, int(m),s_min, sep, w+2,p,s) s = s_sec if z > 1: t = fStrzs(t) return t + s