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)",
|
("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",
|
||||||
|
@ -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 = ''
|
||||||
|
|
||||||
|
if suffix is None:
|
||||||
try:
|
try:
|
||||||
suf = m.group('suffix')
|
suf = m.group('suffix')
|
||||||
except IndexError:
|
except IndexError:
|
||||||
suf = ''
|
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):
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user