Python

2013-05-24 39 views
9

'da negatif sıfır nasıl yazdırılır DMS olarak yazdırmak için ondalık dereceler dönüştürüyorum. Dönüşüm algoritması, modf kullanarak, MS kısmından işaretin çıkarılması ve sadece D kısmı için bırakılması ile birlikte beklediğiniz şeydir.Python

Derece sıfırın sıfır olduğu durum hariç her şey yolunda, -0. Bir örnek

. '% D' eksi işareti damla olarak -0 23'29" ° yazdırmak hangi -0,391612 olduğunu. Ben de burada çalıştığım -0?

yazdırmak için kullanabileceğiniz ne biçim dizesi . "-" dizeleri numaralar çevirir ve bir başa ekler bir kludge ile negatif ise, o zaman "% s" biçimi olarak kullandığı bu garip ve hissediyor inelegant İşte

kod:

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_ geri dönen işlevi önlemek için (-0, -23, -29), doğru döndürür (- 0,23,29). 2 tamamlayıcı tamsayılar (çoğu platformlarda kullanılan) olarak

+6

probleminden minimum örnek kod gösterin. – languitar

+0

+1, çünkü 'modf' kullanmak her şeyi oldukça zarif yapmalıdır –

cevap

17

Kullanım format()

>>> format(-0.0) 
'-0.0' 
>>> format(0.0) 
'0.0' 


>>> print '''{: g}°{}'{}"'''.format(-0.0, 23, 29) 
-0°23'29" 
+1

Çok fazla öğretici/nasıl yapılır websitesi hala 'format' yerine eski '%' notasyonu kullanmayı savunuyor. Bu, neden değiştirilmesinin önemli bir örneğidir. İyi bir! – SethMMorton

+1

@gnibbler Teşekkürler, bu onu çiviledi. Biçimin(), argüman sayısını {} biçimindeki dizinin {} 's sayısı ile aynı olmasını beklediğinden dolayı,' * 'ile tuple'ın genişletilmesi gerektiğine dikkat edin: '' '' {: g} ° {: 02.0f} '{: 02.0f}' '' '. Biçim (* dms) ' –

2

Benden olumsuz sıfır yok değil tam sayı biçiminde bir kayan nokta değeri olarak dereceye yazdırmak gerekir. %d, tamsayıları biçimlendirmek içindir.

print u'{:.0f}°{:.0f}\'{:.0f}\"'.format(deg, fabs(min), fabs(sec)).encode('utf-8') 

deg, min ve sec tüm yüzer vardır fabs görüşmeler ilgili işaretler basılı olmadığı şekilde bulunmaktadır.

Alternatif eski biçimi dize stilini kullanarak:

print (u'%.0f°%.0f\'%.0f\"' % (deg, fabs(min), fabs(sec))).encode('utf-8') 
+0

Neden'% g' yerine '% .0f' kullanılmıyor? –

+2

'% g' üstel bir üslup formatı kullanmayı tercih edebilir Bu durumda hangi değere sahip olacağınıza bağlı olarak -0 ° 2e + 01'3e + 01 "' (benim platformumda) ile sonuçlanacak olan değere bağlı olarak. '% f', üstel olmayan bir biçimin kullanılmasını sağlar. – Joe