fix #12, fixed rounding error, code refactor
This commit is contained in:
parent
d45795aa24
commit
87f0bfd1bf
|
|
@ -20,10 +20,16 @@ Provides facilities for covertion from/to base91
|
|||
"""
|
||||
|
||||
__all__ = ['to_decimal', 'from_decimal']
|
||||
from math import log
|
||||
from math import log, ceil
|
||||
import sys
|
||||
from re import findall
|
||||
from . import string_type, int_type
|
||||
|
||||
if sys.version_info < (3,):
|
||||
_range = xrange
|
||||
else:
|
||||
_range = range
|
||||
|
||||
|
||||
def to_decimal(text):
|
||||
"""
|
||||
|
|
@ -36,6 +42,7 @@ def to_decimal(text):
|
|||
if findall(r"[\x00-\x20\x7c-\xff]", text):
|
||||
raise ValueError("invalid character in sequence")
|
||||
|
||||
text = text.lstrip('!')
|
||||
decimal = 0
|
||||
length = len(text) - 1
|
||||
for i, char in enumerate(text):
|
||||
|
|
@ -60,12 +67,15 @@ def from_decimal(number, padding=1):
|
|||
elif padding < 1:
|
||||
raise ValueError("Expected padding to be >0")
|
||||
elif number > 0:
|
||||
for divisor in [91**e for e in reversed(range(int(log(number) / log(91)) + 1))]:
|
||||
quotient = number // divisor
|
||||
number = number % divisor
|
||||
max_n = ceil(log(number) / log(91))
|
||||
|
||||
for n in _range(int(max_n), -1, -1):
|
||||
quotient, number = divmod(number, 91**n)
|
||||
text.append(chr(33 + quotient))
|
||||
|
||||
# add padding if necessary
|
||||
text = ['!'] * (padding-len(text)) + text
|
||||
text = "".join(text).lstrip('!')
|
||||
|
||||
return "".join(text)
|
||||
# add padding if necessary
|
||||
text = '!' * (padding-len(text)) + text
|
||||
|
||||
return text
|
||||
|
|
|
|||
4
setup.py
4
setup.py
|
|
@ -24,7 +24,9 @@ setup(
|
|||
'Intended Audience :: Developers',
|
||||
'License :: OSI Approved :: GNU General Public License v2 (GPLv2)',
|
||||
'Programming Language :: Python',
|
||||
'Programming Language :: Python :: 2.7',
|
||||
'Programming Language :: Python :: 2',
|
||||
'Programming Language :: Python :: 3',
|
||||
'Programming Language :: Python :: Implementation :: PyPy',
|
||||
'Topic :: Communications :: Ham Radio',
|
||||
],
|
||||
test_suite='tests',
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ class c_Both(unittest.TestCase):
|
|||
self.assertEqual(result, number)
|
||||
|
||||
def test_stability(self):
|
||||
for number in range(50):
|
||||
for number in range(200):
|
||||
largeN = 91 ** number
|
||||
text = base91.from_decimal(largeN)
|
||||
result = base91.to_decimal(text)
|
||||
|
|
|
|||
Loading…
Reference in New Issue