我正在转换十进制度以打印为DMS。转换算法是您期望的,使用modf,添加符号从MS部分取出并仅留给D部分。
除了Degree为负零,-0的情况外,一切都很好。一个例子是-0.391612,它应该打印为-0°23'29“。
“%d”放下负号。我可以使用什么格式字符串来打印-0?
我使用了一个将数字转换为字符串的kludge,如果是负数则预先设置“ - ”,然后使用“%s”作为格式。这很尴尬,感觉不够优雅。
以下是代码:
def dec_to_DMS(decimal_deg):
deg = modf(decimal_deg)[1]
deg_ = fabs(modf(decimal_deg)[0])
min = modf(deg_ * 60)[1]
min_ = modf(deg_ * 60)[0]
sec = modf(min_ * 60)[1]
return deg,min,sec
def print_DMS(dms): # dms is a tuple
# make sure the "-" is printed for -0.xxx
format = ("-" if copysign(1,dms[0]) < 0 else "") + "%d°%02d'%02d\""
return format % dms
print print_DMS(dec_to_DMS(-0.391612))
>>> -0°23'29"
deg_
是为了防止函数返回(-0,-23,-29);它返回正确的(-0,23,29)。
答案 0 :(得分:17)
使用format()
>>> format(-0.0)
'-0.0'
>>> format(0.0)
'0.0'
>>> print '''{: g}°{}'{}"'''.format(-0.0, 23, 29)
-0°23'29"
答案 1 :(得分:2)
您必须将度数打印为浮点值,而不是整数,因为2个补码整数(在大多数平台上使用)不具有负零。 %d
用于格式化整数。
print u'{:.0f}°{:.0f}\'{:.0f}\"'.format(deg, fabs(min), fabs(sec)).encode('utf-8')
deg
,min
和sec
都是花车,fabs
来电就是这样,所以不打印相应的标志。
或者使用旧格式字符串样式:
print (u'%.0f°%.0f\'%.0f\"' % (deg, fabs(min), fabs(sec))).encode('utf-8')