Merge pull request #620 from campagnola/fix-spinbox-units
Fix spinbox units
This commit is contained in:
commit
6773449e43
@ -26,7 +26,7 @@ spins = [
|
||||
("Float with SI-prefixed units<br>(n, u, m, k, M, etc)",
|
||||
pg.SpinBox(value=0.9, suffix='V', siPrefix=True)),
|
||||
("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",
|
||||
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",
|
||||
|
@ -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))
|
||||
|
||||
|
||||
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).
|
||||
|
||||
Example::
|
||||
@ -118,6 +118,12 @@ def siParse(s, regex=FLOAT_REGEX):
|
||||
siParse('100 μV") # returns ('100', 'μ', 'V')
|
||||
"""
|
||||
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)
|
||||
if m is None:
|
||||
raise ValueError('Cannot parse number "%s"' % s)
|
||||
@ -126,15 +132,18 @@ def siParse(s, regex=FLOAT_REGEX):
|
||||
except IndexError:
|
||||
sip = ''
|
||||
|
||||
try:
|
||||
suf = m.group('suffix')
|
||||
except IndexError:
|
||||
suf = ''
|
||||
if suffix is None:
|
||||
try:
|
||||
suf = m.group('suffix')
|
||||
except IndexError:
|
||||
suf = ''
|
||||
else:
|
||||
suf = suffix
|
||||
|
||||
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.
|
||||
|
||||
@ -142,9 +151,9 @@ def siEval(s, typ=float, regex=FLOAT_REGEX):
|
||||
|
||||
siEval("100 μV") # returns 0.0001
|
||||
"""
|
||||
val, siprefix, suffix = siParse(s, regex)
|
||||
val, siprefix, suffix = siParse(s, regex, suffix=suffix)
|
||||
v = typ(val)
|
||||
return siApply(val, siprefix)
|
||||
return siApply(v, siprefix)
|
||||
|
||||
|
||||
def siApply(val, siprefix):
|
||||
|
@ -518,7 +518,7 @@ class SpinBox(QtGui.QAbstractSpinBox):
|
||||
|
||||
# tokenize into numerical value, si prefix, and suffix
|
||||
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:
|
||||
return False
|
||||
|
||||
|
@ -18,6 +18,8 @@ def test_spinbox_formatting():
|
||||
(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.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}')),
|
||||
]
|
||||
|
||||
@ -26,3 +28,14 @@ def test_spinbox_formatting():
|
||||
sb.setValue(value)
|
||||
assert sb.value() == value
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user