deg.py (1506B) - Raw
1 from decimal import Decimal as D 2 3 class Deg: 4 def __str__(self): 5 return "%03d-%02d-%3.1f" % (self.deg, self.mm, self.ss) 6 7 def __init__(self, deg, mm, ss): 8 self.deg = D(deg) 9 self.mm = D(mm) 10 self.ss = D(ss) 11 12 @classmethod 13 def from_1(cls, deg): 14 assert isinstance(deg, D) 15 16 pdeg, pmm = divmod(deg, 1) 17 pmm = pmm * D(60) 18 pmm, pss = divmod(pmm, 1) 19 pss = pss * D(60) 20 return cls(pdeg, pmm, pss) 21 22 @classmethod 23 def guess(cls, instr): 24 if '-' in instr: 25 deg, mm, ss = instr.split('-') 26 return Deg(deg, mm, ss) 27 return cls.from_1(D(instr)) 28 29 @property 30 def frac(self): 31 return ( 32 self.deg + 33 self.mm / D(60) + 34 self.ss / D(3600)).normalize() 35 36 37 import unittest 38 class TestDeg(unittest.TestCase): 39 def test_deg(self): 40 w = Deg.guess('125.505') 41 self.assertEqual(125, w.deg) 42 self.assertEqual(30, w.mm) 43 self.assertEqual(18, w.ss) 44 45 def test_guess(self): 46 w = Deg.guess('112-58-25.4') 47 self.assertEqual(112, w.deg) 48 self.assertEqual(58, w.mm) 49 self.assertEqual(D('25.4'), w.ss) 50 frac = "%3.7f" % w.frac 51 self.assertEqual('112.9737222', frac) 52 53 def test_str_lower(self): 54 w = Deg(120, 1, 42.541) 55 self.assertEqual("120-01-42.5", str(w)) 56 57 def test_str_upper(self): 58 w = Deg(120, 1, 42.545) 59 self.assertEqual("120-01-42.5", str(w))