2013-05-24 14 views
9

Konwertuję dziesiętne stopnie, aby drukować jako DMS. Algorytm konwersji jest tym, czego można się spodziewać, używając modf, z dodatkiem, że znak jest wyjęty z części MS i pozostawiony tylko dla części D.Jak drukować ujemne zero w Pythonie

Wszystko jest w porządku, z wyjątkiem przypadku, gdy stopień jest ujemny zero, -0. Przykładem jest -0,391612 który powinien wydrukować jako -0 ° 23'29" .

«% d» upuszcza znak ujemny. Co format string można użyć do drukowania

-0? Mam obejść . to z kludge który konwertuje numery do strun i poprzedza a „-” jeśli ujemna, wtedy używa „% s” jako format jest to niewygodne i czuje nieeleganckie

Oto 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_ zapobiega powrotowi funkcji (-0, -23, -29), zwraca poprawną (- 0,23,29).

+6

Proszę pokazać minimalną przykładowy kod dla tego problemu. – languitar

+0

+1, ponieważ użycie 'modf' powinno sprawić, że całość będzie całkiem elegancka –

Odpowiedz

17

Zastosowanie format()

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


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

Szkoda, że ​​wiele tutoriali/poradników nadal zaleca używanie starej notacji'% 'zamiast 'formatu'. Jest to doskonały przykład, dlaczego ważne jest, aby się przełączyć. Dobry! – SethMMorton

+1

@gnibbler Dzięki, że go przybili. Zauważ, że krotka musi zostać rozszerzona o '*', ponieważ format() oczekuje, że liczba argumentów będzie taka sama, jak liczba {} w ciągu formatu: ''' '{: g} ° {: 02.0f} '{: 02.0f} "' '.format (* dms)' –

2

Musisz wydrukować stopni jako wartości zmiennoprzecinkowej, a nie jako liczba całkowita, a 2 całkowitymi dopełniacza (stosowany na większości platform) nie mają negatywnego zero. %d służy do formatowania liczb całkowitych.

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

deg, min i sec są wszystkie pływaki, rozmowy fabs jest tak, że odpowiednie znaki nie są drukowane.

Alternatywnie przy użyciu starego stylu format string:

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

Dlaczego po prostu nie używać '% g' zamiast'% .0f'? –

+2

Ponieważ '% g' może wybrać format wykładniczy wariant w zależności od podanej wartości, która w tym przypadku skutkuje '-0 ° 2e + 01'3e + 01" '(na mojej platformie), co zdecydowanie nie jest tym, czego byś chciał. '% f' zapewnia, że ​​używany jest format nie-wykładniczy. – Joe