如何在Python中打印负零
我正在将十进制度数转换为DMS打印。转换算法是您所期望的,使用modf,加上符号从MS部分中取出,只保留在D部分中 除了度数为负0,-0的情况外,一切都很好。例如-0.391612,应打印为-0°23'29” “%d”删除负号。我可以使用什么格式的字符串打印-0 我用一个乱七八糟的方法解决了这个问题,它将数字转换成字符串,如果是负数,则在前面加上“-”,然后使用“%s”作为格式。这很尴尬,感觉很不雅观 代码如下:如何在Python中打印负零,python,python-2.7,Python,Python 2.7,我正在将十进制度数转换为DMS打印。转换算法是您所期望的,使用modf,加上符号从MS部分中取出,只保留在D部分中 除了度数为负0,-0的情况外,一切都很好。例如-0.391612,应打印为-0°23'29” “%d”删除负号。我可以使用什么格式的字符串打印-0 我用一个乱七八糟的方法解决了这个问题,它将数字转换成字符串,如果是负数,则在前面加上“-”,然后使用“%s”作为格式。这很尴尬,感觉很不雅观 代码如下: def dec_to_DMS(decimal_deg): deg = modf
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"
def dec到dem(十进制):
deg=modf(十进制度)[1]
deg_=fabs(modf(十进制度)[0])
最小值=modf(摄氏60度)[1]
最小值=modf(度=60)[0]
sec=modf(最小值60)[1]
返回度,最小值,秒
def print_DMS(DMS):#DMS是一个元组
#确保为-0.xxx打印“-”
格式=(“-”如果copysign(1,dms[0])<0 else”“)+%d°%02d“%02d”
返回格式%dms
打印打印(12月至12月(-0.391612))
>>> -0°23'29"
deg
用于防止函数返回(-0,-23,-29);它返回正确的(-0,23,29)。使用format()
您必须将度数打印为浮点值,而不是整数,因为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')
请给出问题的最小示例代码。+1因为使用modf
会使整个过程变得非常优雅,为什么不直接使用%g
而不是%.0f
?因为%g
可能会根据传递的值选择使用指数格式变量,在这种情况下会导致-0°2e+01'3e+01”
(在我的平台上)这绝对不是您想要的%f
确保使用非指数格式。太糟糕了,这么多教程/指南网站仍然提倡使用旧的%
符号,而不是格式。这是一个很好的例子,说明了为什么切换很重要。好的@格尼布勒:谢谢,那就对了。请注意,元组需要用*
展开,因为format()希望参数的数量与格式字符串中的{}数量相同:''{:g}°{:02.0f}'{:02.0f}''''。format(*dms)
print (u'%.0f°%.0f\'%.0f\"' % (deg, fabs(min), fabs(sec))).encode('utf-8')