diff --git a/src/App/FreeCADInit.py b/src/App/FreeCADInit.py index 286e331ced..e0c001515c 100644 --- a/src/App/FreeCADInit.py +++ b/src/App/FreeCADInit.py @@ -909,6 +909,13 @@ class Scheme(IntEnum): App.Units.Scheme = Scheme +class NumberFormat(IntEnum): + Default = 0 + Fixed = 1 + Scientific = 2 + +App.Units.NumberFormat = NumberFormat + class ScaleType(IntEnum): Other = -1 NoScaling = 0 diff --git a/src/Base/QuantityPy.xml b/src/Base/QuantityPy.xml index f1175a1a63..225cb3714e 100644 --- a/src/Base/QuantityPy.xml +++ b/src/Base/QuantityPy.xml @@ -51,7 +51,7 @@ Quantity(string) -- arbitrary mixture of numbers and chars defining a Quantity Following parameters are allowed: getValueAs('m/s') # unit string to parse getValueAs(2.45,1) # translation value and unit signature - getValueAs(FreeCAD.Units.Pascal) # predefined standard units + getValueAs(FreeCAD.Units.Pascal) # predefined standard units getValueAs(Qantity('N/m^2')) # a quantity getValueAs(Unit(0,1,0,0,0,0,0,0)) # a unit diff --git a/src/Base/QuantityPyImp.cpp b/src/Base/QuantityPyImp.cpp index 7d0cf2eec0..84d0b4082c 100644 --- a/src/Base/QuantityPyImp.cpp +++ b/src/Base/QuantityPyImp.cpp @@ -628,15 +628,24 @@ void QuantityPy::setFormat(Py::Dict arg) } if (arg.hasKey("NumberFormat")) { - Py::Char form(arg.getItem("NumberFormat")); - std::string fmtstr = static_cast(Py::String(form)); - if (fmtstr.size() != 1) - throw Py::ValueError("Invalid format character"); + Py::Object item = arg.getItem("NumberFormat"); + if (item.isNumeric()) { + int format = static_cast(Py::Int(item)); + if (format < 0 || format > QuantityFormat::Scientific) + throw Py::ValueError("Invalid format value"); + fmt.format = static_cast(format); + } + else { + Py::Char form(item); + std::string fmtstr = static_cast(Py::String(form)); + if (fmtstr.size() != 1) + throw Py::ValueError("Invalid format character"); - bool ok; - fmt.format = Base::QuantityFormat::toFormat(fmtstr[0], &ok); - if (!ok) - throw Py::ValueError("Invalid format character"); + bool ok; + fmt.format = Base::QuantityFormat::toFormat(fmtstr[0], &ok); + if (!ok) + throw Py::ValueError("Invalid format character"); + } } if (arg.hasKey("Denominator")) { diff --git a/src/Mod/Test/UnitTests.py b/src/Mod/Test/UnitTests.py index c3e2160b69..575f6f5680 100644 --- a/src/Mod/Test/UnitTests.py +++ b/src/Mod/Test/UnitTests.py @@ -110,9 +110,7 @@ class UnitBasicCases(unittest.TestCase): self.assertAlmostEqual(1, v.Value, msg="Failed with \"{0}\" scheme: {1} != 1 (delta: {2})".format(schemes[i], v.Value, self.delta), delta=self.delta) vacuum_permittivity = FreeCAD.Units.parseQuantity("1F/m") - format = vacuum_permittivity.Format - format["NumberFormat"] = "e" # scientific notation - vacuum_permittivity.Format = format + vacuum_permittivity.Format = {"NumberFormat" : FreeCAD.Units.NumberFormat.Scientific} for i in range(num): t = FreeCAD.Units.schemaTranslate(vacuum_permittivity, i) v = FreeCAD.Units.parseQuantity(t[0]).getValueAs("F/m")