# Typed Bytesize
[](https://crates.io/crates/typed-bytesize)
[](https://docs.rs/typed-bytesize/)
[](https://github.com/TD-Sky/typed-bytesize/actions/workflows/check.yml)
[](https://github.com/TD-Sky/typed-bytesize/actions/workflows/test.yml)
The library provides two types to represent bytesize:
- [ByteSizeSi](https://docs.rs/typed-bytesize/latest/typed_bytesize/struct.ByteSizeSi.html) for **decimal** prefix unit ([SI](https://en.wikipedia.org/wiki/International_System_of_Units))
- [ByteSizeIec](https://docs.rs/typed-bytesize/latest/typed_bytesize/struct.ByteSizeIec.html) for **binary** prefix unit (IEC 80000-13)
## Functions
- Bytesize types can parse each other's units (e.g. `ByteSizeIec` can parse SI values like `114514GB`);
- Bytesize values will only be formatted as the unit has their owned prefix;
- Bytesize types can be converted to each other;
- Supporting *addition*, *subtraction*, *scalar multiplication* arithmetic operations;
- Optional [serde](https://crates.io/crates/serde) support.
## Example
```rust
use typed_bytesize::{ByteSizeIec, ByteSizeSi};
// SI
assert_eq!(ByteSizeSi::b(114u64), "114".parse().unwrap());
assert_eq!(ByteSizeSi::mb(114), "114MB".parse().unwrap());
print!("{}", ByteSizeSi::kb(310)); // 310.0kB
// IEC
assert_eq!(ByteSizeIec::b(514u64), "514".parse().unwrap());
assert_eq!(ByteSizeIec::mib(514), "514MiB".parse().unwrap());
print!("{}", ByteSizeIec::gib(93696)); // 91.5GiB
```
For more detailed examples, refer to [tests](https://docs.rs/crate/typed-bytesize/latest/source/src/tests.rs).
## BNF
Parsing follows the rule:
```ignore
decimal ::= num | float
float ::= num "." num
num ::= [0-9]+
```
## Features
- `serde`: enable [serde](https://crates.io/crates/serde) on `ByteSizeSi` and `ByteSizeIec`.
- `u128`: use `u128` instead of `u64` as inner numeric type to support larger units. (TODO)