boost.units converting double tp SI prefix
Hi, is there a way to use boost.units to convert a double automatically to a SI unit prefix, e.g. 10e-3 to 10m or 10e3 to 10k ?? The value isn't know at compile time, so the decision has to be done on runtime. Thanks, Olaf
AMDG Olaf Peter wrote:
is there a way to use boost.units to convert a double automatically to a SI unit prefix, e.g. 10e-3 to 10m or 10e3 to 10k ?? The value isn't know at compile time, so the decision has to be done on runtime.
There is not such a facility. There will soon be support for printing things like 1.0 km instead of 1000 m, but formatting of raw numbers is somewhat beyond the scope of the library. In Christ, Steven Watanabe
-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Steven Watanabe Sent: Friday, March 12, 2010 7:23 PM To: boost-users@lists.boost.org Subject: Re: [Boost-users] boost.units converting double tp SI prefix
AMDG
Olaf Peter wrote:
is there a way to use boost.units to convert a double automatically to a SI unit prefix, e.g. 10e-3 to 10m or 10e3 to 10k ?? The value isn't know at compile time, so the decision has to be done on runtime.
There is not such a facility. There will soon be support for printing things like 1.0 km instead of 1000 m, but formatting of raw numbers is somewhat beyond the scope of the library.
But I think that you can create your own unit (and quantity) easily, and then you *can* use the very useful auto prefixing system Steven has devised. For example for show this, I've created a entirely useless 'thing' type - dimensionless of course. It could be widget count, (or indeed a unit of currency) with a name and symbol. struct thing_base_unit : boost::units::base_unit<thing_base_unit, boost::units::dimensionless_type, 4> { static const char* name() { return("thing"); } static const char* symbol() { return(""); } }; and this constructs a quantity of it (2048.0 - a double by default) quantity<thing_base_unit::unit_type> t = 2048. * thing_base_unit::unit_type(); and you can then chose to output with a trailing name of your choice cout << name_format << engineering_prefix << t << endl; // 2.048 kilothing and similarly with a symbol (I've defined my symbol to be a "", so I just get the SI prefix. cout << symbol_format << engineering_prefix << t << endl; // 2.048 k Steven has even more cunningly allowed the binary 2^10, 2^20, 2^30 ... prefixes, cout << binary_prefix << t << endl; // "2 Ki" For currency, the multiple (k, M, G) *must precede* the name or symbol of the unit. (*not* Symbol first as one might really want for $, £ € ...) quantity<euro_base_unit::unit_type> ce = 2048. * euro_base_unit::unit_type(); cout << name_format << engineering_prefix << ce << endl; // 2.048 kiloEUR cout << symbol_format << engineering_prefix << ce << endl; // 2.048 k€ Perhaps this will meet your needs when available? Paul --- Paul A. Bristow Prizet Farmhouse Kendal, UK LA8 8AB +44 1539 561830, mobile +44 7714330204 pbristow@hetp.u-net.com
participants (3)
-
Olaf Peter
-
Paul A. Bristow
-
Steven Watanabe