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
// 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.
//!
//! It includes [`FixedDecimal`], a core API for representing numbers in a human-readable form
//! appropriate for formatting and plural rule selection. It is optimized for operations involving
//! the individual digits of a number.
//!
//! # Examples
//!
//! ```
//! use fixed_decimal::FixedDecimal;
//!
//! let dec = FixedDecimal::from(250)
//! .multiplied_pow10(-2)
//! .expect("Bounds are small");
//! 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
#![cfg_attr(not(any(feature = "std", test)), no_std)]
pub mod decimal;
pub mod signum;
mod uint_iterator;
#[cfg(feature = "ryu")]
pub use decimal::DoublePrecision;
pub use decimal::FixedDecimal;
use displaydoc::Display;
pub use signum::Signum;
#[derive(Display, Debug, PartialEq)]
pub enum Error {
/// The magnitude or number of digits exceeds the limit of the FixedDecimal. The highest
/// magnitude of the most significant digit is core::i16::MAX, and the lowest magnitude of the
/// least significant digit is core::i16::MIN.
///
/// # Examples
///
/// ```
/// use fixed_decimal::FixedDecimal;
/// use fixed_decimal::Error;
///
/// let mut dec1 = FixedDecimal::from(123);
/// assert_eq!(Error::Limit, dec1.multiply_pow10(core::i16::MAX).unwrap_err());
/// ```
#[displaydoc("Magnitude or number of digits exceeded")]
Limit,
/// The input of a string that is supposed to be converted to FixedDecimal is not accepted.
///
/// Any string with non-digit characters (except for one '.' and one '-' at the beginning of the string) is not accepted.
/// Also, empty string ("") and its negation ("-") are not accepted.
/// Strings of form "12_345_678" are not accepted, the accepted format is "12345678".
/// Also '.' shouldn't be first or the last characters, i. e. .123 and 123. are not accepted, and instead 0.123 and
/// 123 (or 123.0) must be used.
#[displaydoc("Failed to parse the input string")]
Syntax,
}
#[cfg(feature = "std")]
impl std::error::Error for Error {}