https://github.com/slightlynybbled/engineering_notation
Easy engineering notation using python
https://github.com/slightlynybbled/engineering_notation
engineering-notation
Last synced: 8 months ago
JSON representation
Easy engineering notation using python
- Host: GitHub
- URL: https://github.com/slightlynybbled/engineering_notation
- Owner: slightlynybbled
- License: mit
- Created: 2017-05-30T16:04:42.000Z (about 9 years ago)
- Default Branch: master
- Last Pushed: 2023-12-06T13:00:31.000Z (over 2 years ago)
- Last Synced: 2025-09-22T17:12:55.261Z (9 months ago)
- Topics: engineering-notation
- Language: Python
- Size: 56.6 KB
- Stars: 47
- Watchers: 8
- Forks: 11
- Open Issues: 3
-
Metadata Files:
- Readme: readme.md
- License: license.txt
Awesome Lists containing this project
README
[](https://github.com/slightlynybbled/engineering_notation/actions/workflows/unittest.yml)
# Purpose
To easily work with human-readable engineering notation. I wrote this as a quick tool for my own use.
I found that I was writing the same functionality into multiple packages and would like a quick pip-installable
package to take care of this manipulation for me. The package should be easily extended for other use cases.
The package is unit-less, so only operates on numeric values. Unit detection may be added in future versions.
More information may be found at [for(embed)](http://forembed.com/engineering-notation-in-python.html).
# Installation
Install using pip: `pip install engineering_notation`.
# Status and Contributions
This project currently has 100% test coverage. Have a look in `test.py` for examples of how to use
this library. To execute the tests, run `pytest` from the main directory or,
in some environments, it may be necessary to run `python3 -m pytest`.
Any contributions must pass 100% of current tests and pass flake8. To execute
flake8, navigate to the project directory and `python3 setup.py flake8`.
Your pull request will automatically be run through testing and flake8 checks and
any pull requests that do not pass these will be put on hold pending passing.
# Use
There are multiple ways of initializing a number to a particular value, but a string is the preferred method:
```
>>> from engineering_notation import EngNumber
>>> EngNumber('10k')
10k
>>> EngNumber('10000')
10k
>>> EngNumber(10000)
10k
>>> EngNumber(10000.0)
10k
>>> EngNumber(1e4)
10k
```
Where decimals are involved, we use a default precision of 2 digits:
```
>>> EngNumber('4.99k')
4.99k
>>> EngNumber('4.9k')
4.90k
```
This behavior can truncate your results in some cases, and cause your number to round. To specify more or less
digits, simply specify the precision in the declaration:
```
>>> EngNumber('4.999k')
5k
>>> EngNumber('4.999k', precision=3)
4.999k
```
Most operations that you would perform on numeric values are valid, although all operations are not implemented:
```
>>> EngNumber('2.2k') * 2
4.40k
>>> 2 * EngNumber('2.2k')
4.40k
>>> EngNumber(1.2) > EngNumber('3.3k')
False
>>> EngNumber(1.2) <= EngNumber('3.3k')
True
>>> EngNumber('3.3k') == EngNumber(3300)
True
```
All of the above operations are also possible on the `EngUnit()` class as well. The only difference is
that units must match for addition/subtraction/comparison operations. Although multiplication and division
operations will work numerically, they may not always be strictly correct. This is because EngUnit is not
intended to replace a computer algebra system!
```
>>> EngUnit('2s') / EngUnit('4rotations')
0.5s/rotations
```
Additionally, since there are 'reserved' letters for sizing the number, you must be careful with your units!
```
>>> EngUnit('2mm')
2mm # <<< this value equivalent to "0.002m"
>>> EngUnit('2meter')
2meter # <<< this value is equivalent to "0.002eter", the "m" was used to scale the unit!
>>> EngUnit('2', unit='meter') # <<< this will work better
```
# Contributions
Contributions are welcome. Feel free to make feature requests in the issues.