1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
//! `fixed_decimal` is a utility crate of the [`ICU4X`] project.
//!
//! This crate provides [`Decimal`] and [`UnsignedDecimal`], essential APIs for representing numbers in a human-readable format.
//! These types are particularly useful for formatting and plural rule selection, and are optimized for operations on individual digits.
//!
//! # Examples
//!
//! ```
//! use fixed_decimal::Decimal;
//!
//! let mut dec = Decimal::from(250);
//! dec.multiply_pow10(-2);
//! assert_eq!("2.50", format!("{}", dec));
//!
//! #[derive(Debug, PartialEq)]
//! struct MagnitudeAndDigit(i16, u8);
//!
//! let digits: Vec<MagnitudeAndDigit> = dec
//! .magnitude_range()
//! .map(|m| MagnitudeAndDigit(m, dec.digit_at(m)))
//! .collect();
//!
//! assert_eq!(
//! vec![
//! MagnitudeAndDigit(-2, 0),
//! MagnitudeAndDigit(-1, 5),
//! MagnitudeAndDigit(0, 2)
//! ],
//! digits
//! );
//! ```
//!
//! [`ICU4X`]: ../icu/index.html
// https://github.com/unicode-org/icu4x/blob/main/documents/process/boilerplate.md#library-annotations
pub use FloatPrecision;
// use variations::Signed;
// use variations::WithInfinity;
// use variations::WithNaN;
pub use FloatPrecision as DoublePrecision;
pub use CompactDecimal;
pub use UnsignedDecimal;
use Display;
pub use FixedInteger;
pub use RoundingIncrement;
pub use SignedRoundingMode;
pub use UnsignedRoundingMode;
pub use ScientificDecimal;
pub use Decimal;
pub use Sign;
pub use SignDisplay;
pub use Signed;
pub use IncrementLike;
pub use NoIncrement;
/// The magnitude or number of digits exceeds the limit of the [`UnsignedDecimal`] or [`Decimal`].
///
/// The highest
/// magnitude of the most significant digit is [`i16::MAX`], and the lowest magnitude of the
/// least significant digit is [`i16::MIN`].
///
/// This error is also returned when constructing a [`FixedInteger`] from a [`Decimal`] with a
/// fractional part.
///
/// # Examples
///
/// ```
/// use fixed_decimal::Decimal;
/// use fixed_decimal::LimitError;
///
/// let mut dec1 = Decimal::from(123);
/// dec1.multiply_pow10(i16::MAX);
/// assert!(dec1.is_zero());
/// ```
;
/// An error involving FixedDecimal operations or conversion.
// TODO(#5065): implement these while `WithCompactExponent` and `WithScientificExponent` are implemented.
// pub type FixedDecimalOrInfinity = WithInfinity<UnsignedDecimal>;
// pub type DecimalOrInfinity = Signed<FixedDecimalOrInfinity>;
// pub type DecimalOrInfinityOrNan = WithNaN<DecimalOrInfinity>;