#postgresql #decimal #numeric

pgnumeric

用Rust编写的任意精度数值实现,与PostgreSQL的数值兼容

4个版本

0.2.1 2020年8月28日
0.2.0 2020年7月3日
0.1.1 2020年5月13日
0.1.0 2020年5月6日

#1088 in 编码

Apache-2.0

315KB
6.5K SLoC

pgnumeric

Apache-2.0 licensed Minimum rustc version Crate API

用Rust编写的任意精度数值实现,与PostgreSQL的数值兼容。

参阅: PostgreSQL任意精度数字

此crate提供了两种类型, NumericBufNumeric

可选功能

serde

当此可选依赖项启用时, NumericBufNumeric 实现了 serde::Serializeserde::Deserialize 特性。

用法

要构建一个数值,使用 NumericBuf

use pgnumeric::NumericBuf;

let n1: NumericBuf = "123".parse().unwrap();
let n2: NumericBuf = "456".parse().unwrap();
let result = n1 + n2;
assert_eq!(result.to_string(), "579");

从Rust原始类型构建数值

use pgnumeric::NumericBuf;

let n1: NumericBuf = From::from(123_i32);
let n2: NumericBuf = From::from(456_i32);
let result = n1 + n2;
assert_eq!(result, Into::<NumericBuf>::into(579_i32));

数值支持高精度算术运算。

use pgnumeric::NumericBuf;

let n1: NumericBuf = "123456789.987654321".parse().unwrap();
let n2: NumericBuf = "987654321.123456789".parse().unwrap();
let result = n1 * n2;
assert_eq!(result.to_string(), "121932632103337905.662094193112635269");

let n3 = "170141183460469231731687303715884105727".parse::<NumericBuf>().unwrap();
assert_eq!(n3.sqrt().to_string(), "13043817825332782212")

数值可以被序列化为字节数组并从字节数组反序列化。

use pgnumeric::{NumericBuf, Numeric};

let n1 = "123456789.987654321".parse::<NumericBuf>().unwrap();
let bytes = n1.as_bytes();
let n2 = unsafe { Numeric::from_bytes_unchecked(bytes) };
assert_eq!(n1, n2);

Rust版本要求

pgnumeric 在rust 1.43 上工作。

许可证

此项目采用Apache-2.0许可证 (LICENSEhttp://www.apache.org/licenses/LICENSE-2.0)。

贡献

除非您明确声明,否则您有意提交给 pgnumeric 的任何贡献,都应按Apache-2.0许可证授权,无任何附加条款或条件。

依赖关系

~105–305KB