Merge pull request #620 from campagnola/fix-spinbox-units

Fix spinbox units
This commit is contained in:
Luke Campagnola 2018-01-25 08:47:07 -08:00 committed by GitHub
commit 6773449e43
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 10 deletions

View File

@ -26,7 +26,7 @@ spins = [
("Float with SI-prefixed units<br>(n, u, m, k, M, etc)", ("Float with SI-prefixed units<br>(n, u, m, k, M, etc)",
pg.SpinBox(value=0.9, suffix='V', siPrefix=True)), pg.SpinBox(value=0.9, suffix='V', siPrefix=True)),
("Float with SI-prefixed units,<br>dec step=0.1, minStep=0.1", ("Float with SI-prefixed units,<br>dec step=0.1, minStep=0.1",
pg.SpinBox(value=1.0, suffix='V', siPrefix=True, dec=True, step=0.1, minStep=0.1)), pg.SpinBox(value=1.0, suffix='PSI', siPrefix=True, dec=True, step=0.1, minStep=0.1)),
("Float with SI-prefixed units,<br>dec step=0.5, minStep=0.01", ("Float with SI-prefixed units,<br>dec step=0.5, minStep=0.01",
pg.SpinBox(value=1.0, suffix='V', siPrefix=True, dec=True, step=0.5, minStep=0.01)), pg.SpinBox(value=1.0, suffix='V', siPrefix=True, dec=True, step=0.5, minStep=0.01)),
("Float with SI-prefixed units,<br>dec step=1.0, minStep=0.001", ("Float with SI-prefixed units,<br>dec step=1.0, minStep=0.001",

View File

@ -110,7 +110,7 @@ def siFormat(x, precision=3, suffix='', space=True, error=None, minVal=1e-25, al
return fmt % (x*p, pref, suffix, plusminus, siFormat(error, precision=precision, suffix=suffix, space=space, minVal=minVal)) return fmt % (x*p, pref, suffix, plusminus, siFormat(error, precision=precision, suffix=suffix, space=space, minVal=minVal))
def siParse(s, regex=FLOAT_REGEX): def siParse(s, regex=FLOAT_REGEX, suffix=None):
"""Convert a value written in SI notation to a tuple (number, si_prefix, suffix). """Convert a value written in SI notation to a tuple (number, si_prefix, suffix).
Example:: Example::
@ -118,6 +118,12 @@ def siParse(s, regex=FLOAT_REGEX):
siParse('100 μV") # returns ('100', 'μ', 'V') siParse('100 μV") # returns ('100', 'μ', 'V')
""" """
s = asUnicode(s) s = asUnicode(s)
s = s.strip()
if suffix is not None and len(suffix) > 0:
if s[-len(suffix):] != suffix:
raise ValueError("String '%s' does not have the expected suffix '%s'" % (s, suffix))
s = s[:-len(suffix)] + 'X' # add a fake suffix so the regex still picks up the si prefix
m = regex.match(s) m = regex.match(s)
if m is None: if m is None:
raise ValueError('Cannot parse number "%s"' % s) raise ValueError('Cannot parse number "%s"' % s)
@ -126,15 +132,18 @@ def siParse(s, regex=FLOAT_REGEX):
except IndexError: except IndexError:
sip = '' sip = ''
try: if suffix is None:
suf = m.group('suffix') try:
except IndexError: suf = m.group('suffix')
suf = '' except IndexError:
suf = ''
else:
suf = suffix
return m.group('number'), '' if sip is None else sip, '' if suf is None else suf return m.group('number'), '' if sip is None else sip, '' if suf is None else suf
def siEval(s, typ=float, regex=FLOAT_REGEX): def siEval(s, typ=float, regex=FLOAT_REGEX, suffix=None):
""" """
Convert a value written in SI notation to its equivalent prefixless value. Convert a value written in SI notation to its equivalent prefixless value.
@ -142,9 +151,9 @@ def siEval(s, typ=float, regex=FLOAT_REGEX):
siEval("100 μV") # returns 0.0001 siEval("100 μV") # returns 0.0001
""" """
val, siprefix, suffix = siParse(s, regex) val, siprefix, suffix = siParse(s, regex, suffix=suffix)
v = typ(val) v = typ(val)
return siApply(val, siprefix) return siApply(v, siprefix)
def siApply(val, siprefix): def siApply(val, siprefix):

View File

@ -518,7 +518,7 @@ class SpinBox(QtGui.QAbstractSpinBox):
# tokenize into numerical value, si prefix, and suffix # tokenize into numerical value, si prefix, and suffix
try: try:
val, siprefix, suffix = fn.siParse(strn, self.opts['regex']) val, siprefix, suffix = fn.siParse(strn, self.opts['regex'], suffix=self.opts['suffix'])
except Exception: except Exception:
return False return False

View File

@ -18,6 +18,8 @@ def test_spinbox_formatting():
(12345678955, '12345678955', dict(int=True, decimals=100)), (12345678955, '12345678955', dict(int=True, decimals=100)),
(1.45e-9, '1.45e-09 A', dict(int=False, decimals=6, suffix='A', siPrefix=False)), (1.45e-9, '1.45e-09 A', dict(int=False, decimals=6, suffix='A', siPrefix=False)),
(1.45e-9, '1.45 nA', dict(int=False, decimals=6, suffix='A', siPrefix=True)), (1.45e-9, '1.45 nA', dict(int=False, decimals=6, suffix='A', siPrefix=True)),
(1.45, '1.45 PSI', dict(int=False, decimals=6, suffix='PSI', siPrefix=True)),
(1.45e-3, '1.45 mPSI', dict(int=False, decimals=6, suffix='PSI', siPrefix=True)),
(-2500.3427, '$-2500.34', dict(int=False, format='${value:0.02f}')), (-2500.3427, '$-2500.34', dict(int=False, format='${value:0.02f}')),
] ]
@ -26,3 +28,14 @@ def test_spinbox_formatting():
sb.setValue(value) sb.setValue(value)
assert sb.value() == value assert sb.value() == value
assert pg.asUnicode(sb.text()) == text assert pg.asUnicode(sb.text()) == text
# test setting value
if not opts.get('int', False):
suf = sb.opts['suffix']
sb.lineEdit().setText('0.1' + suf)
sb.editingFinishedEvent()
assert sb.value() == 0.1
if suf != '':
sb.lineEdit().setText('0.1 m' + suf)
sb.editingFinishedEvent()
assert sb.value() == 0.1e-3