kopia lustrzana https://github.com/NanoVNA-Saver/nanovna-saver
New SI prefixes added - Ronna, Quetta - Yeah! (#570)
rodzic
9c5b1e01ea
commit
fb50f4a01b
|
@ -22,8 +22,8 @@ from decimal import Context, Decimal, InvalidOperation
|
||||||
from typing import NamedTuple
|
from typing import NamedTuple
|
||||||
from numbers import Number, Real
|
from numbers import Number, Real
|
||||||
|
|
||||||
PREFIXES = ("y", "z", "a", "f", "p", "n", "µ", "m",
|
PREFIXES = ("q", "r", "y", "z", "a", "f", "p", "n", "µ", "m",
|
||||||
"", "k", "M", "G", "T", "P", "E", "Z", "Y")
|
"", "k", "M", "G", "T", "P", "E", "Z", "Y", "R", "Q")
|
||||||
|
|
||||||
|
|
||||||
def clamp_value(value: Real, rmin: Real, rmax: Real) -> Real:
|
def clamp_value(value: Real, rmin: Real, rmax: Real) -> Real:
|
||||||
|
@ -56,8 +56,8 @@ class Format(NamedTuple):
|
||||||
fix_decimals: bool = False
|
fix_decimals: bool = False
|
||||||
space_str: str = ""
|
space_str: str = ""
|
||||||
assume_infinity: bool = True
|
assume_infinity: bool = True
|
||||||
min_offset: int = -8
|
min_offset: int = -10
|
||||||
max_offset: int = 8
|
max_offset: int = 10
|
||||||
allow_strip: bool = False
|
allow_strip: bool = False
|
||||||
allways_signed: bool = False
|
allways_signed: bool = False
|
||||||
printable_min: float = -math.inf
|
printable_min: float = -math.inf
|
||||||
|
@ -71,11 +71,11 @@ class Format(NamedTuple):
|
||||||
|
|
||||||
|
|
||||||
class Value:
|
class Value:
|
||||||
CTX = Context(prec=60, Emin=-27, Emax=27)
|
CTX = Context(prec=60, Emin=-33, Emax=33)
|
||||||
|
|
||||||
def __init__(self, value: Real = Decimal(0), unit: str = "", fmt=Format()):
|
def __init__(self, value: Real = Decimal(0), unit: str = "", fmt=Format()):
|
||||||
assert 1 <= fmt.max_nr_digits <= 30
|
assert 1 <= fmt.max_nr_digits <= 30
|
||||||
assert -8 <= fmt.min_offset <= fmt.max_offset <= 8
|
assert -10 <= fmt.min_offset <= fmt.max_offset <= 10
|
||||||
assert fmt.parse_clamp_min < fmt.parse_clamp_max
|
assert fmt.parse_clamp_min < fmt.parse_clamp_max
|
||||||
assert fmt.printable_min < fmt.printable_max
|
assert fmt.printable_min < fmt.printable_max
|
||||||
self._unit = unit
|
self._unit = unit
|
||||||
|
@ -128,7 +128,7 @@ class Value:
|
||||||
if self.fmt.allow_strip and "." in result:
|
if self.fmt.allow_strip and "." in result:
|
||||||
result = result.rstrip("0").rstrip(".")
|
result = result.rstrip("0").rstrip(".")
|
||||||
|
|
||||||
return result + fmt.space_str + PREFIXES[offset + 8] + self._unit
|
return result + fmt.space_str + PREFIXES[offset + 10] + self._unit
|
||||||
|
|
||||||
def __int__(self):
|
def __int__(self):
|
||||||
return round(self._value)
|
return round(self._value)
|
||||||
|
@ -163,7 +163,7 @@ class Value:
|
||||||
if self.fmt.parse_sloppy_kilo and value[-1] in ("K", "m", "g"):
|
if self.fmt.parse_sloppy_kilo and value[-1] in ("K", "m", "g"):
|
||||||
value = value[:-1] + value[-1].swapcase()
|
value = value[:-1] + value[-1].swapcase()
|
||||||
if value[-1] in PREFIXES:
|
if value[-1] in PREFIXES:
|
||||||
factor = 10 ** ((PREFIXES.index(value[-1]) - 8) * 3)
|
factor = 10 ** ((PREFIXES.index(value[-1]) - 10) * 3)
|
||||||
value = value[:-1]
|
value = value[:-1]
|
||||||
|
|
||||||
if self.fmt.assume_infinity and value == "\N{INFINITY}":
|
if self.fmt.assume_infinity and value == "\N{INFINITY}":
|
||||||
|
|
|
@ -29,9 +29,9 @@ F_DEFAULT = Format()
|
||||||
|
|
||||||
F_ASSERT_DIGITS_0 = Format(max_nr_digits=0)
|
F_ASSERT_DIGITS_0 = Format(max_nr_digits=0)
|
||||||
F_ASSERT_DIGITS_2 = Format(max_nr_digits=31)
|
F_ASSERT_DIGITS_2 = Format(max_nr_digits=31)
|
||||||
F_ASSERT_OFFSET_1 = Format(min_offset=-9)
|
F_ASSERT_OFFSET_1 = Format(min_offset=-11)
|
||||||
F_ASSERT_OFFSET_2 = Format(max_offset=9)
|
F_ASSERT_OFFSET_2 = Format(max_offset=11)
|
||||||
F_ASSERT_OFFSET_3 = Format(min_offset=9)
|
F_ASSERT_OFFSET_3 = Format(min_offset=11)
|
||||||
F_ASSERT_CLAMP = Format(parse_clamp_min=10, parse_clamp_max=9)
|
F_ASSERT_CLAMP = Format(parse_clamp_min=10, parse_clamp_max=9)
|
||||||
|
|
||||||
F_DIGITS_1 = Format(max_nr_digits=1, min_offset=-2,
|
F_DIGITS_1 = Format(max_nr_digits=1, min_offset=-2,
|
||||||
|
@ -81,8 +81,10 @@ class TestSIToolsValue(unittest.TestCase):
|
||||||
self.assertEqual(str(Value(1e18)), "1.00000E")
|
self.assertEqual(str(Value(1e18)), "1.00000E")
|
||||||
self.assertEqual(str(Value(1e21)), "1.00000Z")
|
self.assertEqual(str(Value(1e21)), "1.00000Z")
|
||||||
self.assertEqual(str(Value(1e24)), "1.00000Y")
|
self.assertEqual(str(Value(1e24)), "1.00000Y")
|
||||||
self.assertEqual(str(Value(1e27)), "\N{INFINITY}")
|
self.assertEqual(str(Value(1e27)), "1.00000R")
|
||||||
self.assertEqual(str(Value(-1e27)), "-\N{INFINITY}")
|
self.assertEqual(str(Value(1e30)), "1.00000Q")
|
||||||
|
self.assertEqual(str(Value(1e34)), "\N{INFINITY}")
|
||||||
|
self.assertEqual(str(Value(-1e34)), "-\N{INFINITY}")
|
||||||
self.assertEqual(str(Value(nan)), "-")
|
self.assertEqual(str(Value(nan)), "-")
|
||||||
self.assertEqual(float(Value(1e27)), 1e27)
|
self.assertEqual(float(Value(1e27)), 1e27)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
@ -100,11 +102,13 @@ class TestSIToolsValue(unittest.TestCase):
|
||||||
self.assertEqual(str(Value(1e-18)), "1.00000a")
|
self.assertEqual(str(Value(1e-18)), "1.00000a")
|
||||||
self.assertEqual(str(Value(1e-21)), "1.00000z")
|
self.assertEqual(str(Value(1e-21)), "1.00000z")
|
||||||
self.assertEqual(str(Value(1e-24)), "1.00000y")
|
self.assertEqual(str(Value(1e-24)), "1.00000y")
|
||||||
self.assertEqual(str(Value(1e-27)), "0.00100y")
|
self.assertEqual(str(Value(1e-27)), "1.00000r")
|
||||||
self.assertEqual(str(Value(1e-29)), "0.00001y")
|
self.assertEqual(str(Value(1e-30)), "1.00000q")
|
||||||
self.assertEqual(str(Value(-1e-29)), "-0.00001y")
|
self.assertEqual(str(Value(1e-33)), "0.00100q")
|
||||||
self.assertEqual(str(Value(1e-30)), "0.00000")
|
self.assertEqual(str(Value(1e-35)), "0.00001q")
|
||||||
self.assertEqual(float(Value(1e-30)), 1e-30)
|
self.assertEqual(str(Value(-1e-35)), "-0.00001q")
|
||||||
|
self.assertEqual(str(Value(1e-36)), "0.00000")
|
||||||
|
self.assertEqual(float(Value(1e-36)), 1e-36)
|
||||||
|
|
||||||
def test_format_digits_1(self):
|
def test_format_digits_1(self):
|
||||||
v = Value(fmt=F_DIGITS_1)
|
v = Value(fmt=F_DIGITS_1)
|
||||||
|
|
Ładowanie…
Reference in New Issue