malachite_base/num/conversion/string/mod.rs
1// Copyright © 2025 Mikhail Hogrefe
2//
3// This file is part of Malachite.
4//
5// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
6// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
7// 3 of the License, or (at your option) any later version. See <https://www.gnu.org/licenses/>.
8
9/// [`FromSciString`](super::traits::FromSciString), a trait for converting strings, possibly using
10/// scientific notation, to numbers.
11///
12/// # from_sci_string
13/// ```
14/// use malachite_base::num::conversion::traits::FromSciString;
15///
16/// assert_eq!(u8::from_sci_string("123"), Some(123));
17/// assert_eq!(u8::from_sci_string("123.5"), Some(124));
18/// assert_eq!(u8::from_sci_string("256"), None);
19/// assert_eq!(u64::from_sci_string("1.23e10"), Some(12300000000));
20/// ```
21///
22/// # from_sci_string_with_options
23/// ```
24/// use malachite_base::num::conversion::string::options::FromSciStringOptions;
25/// use malachite_base::num::conversion::traits::FromSciString;
26/// use malachite_base::rounding_modes::RoundingMode::*;
27///
28/// let mut options = FromSciStringOptions::default();
29/// assert_eq!(
30/// u8::from_sci_string_with_options("123.5", options),
31/// Some(124)
32/// );
33///
34/// options.set_rounding_mode(Floor);
35/// assert_eq!(
36/// u8::from_sci_string_with_options("123.5", options),
37/// Some(123)
38/// );
39///
40/// options = FromSciStringOptions::default();
41/// options.set_base(16);
42/// assert_eq!(u8::from_sci_string_with_options("ff", options), Some(255));
43/// ```
44pub mod from_sci_string;
45/// [`FromStringBase`](super::traits::FromStringBase), a trait for converting strings in a specified
46/// base to numbers.
47pub mod from_string;
48/// [`ToSciOptions`](options::ToSciOptions) and
49/// [`FromSciSringOptions`](options::FromSciStringOptions), `struct`s for specifying parameters when
50/// using the [`FromSciString`](super::traits::FromSciString) and [`ToSci`](super::traits::ToSci)
51/// traits.
52pub mod options;
53/// [`ToSci`](super::traits::ToSci), a trait for converting a number to string, possibly using
54/// scientific notation.
55///
56/// # to_sci
57/// ```
58/// use malachite_base::num::conversion::traits::ToSci;
59///
60/// // If the value can fit in a `u32`, the result is the same as with `to_string`
61/// assert_eq!(123u8.to_sci().to_string(), "123");
62///
63/// assert_eq!(u128::MAX.to_sci().to_string(), "3.402823669209385e38");
64/// assert_eq!(i128::MIN.to_sci().to_string(), "-1.701411834604692e38");
65/// ```
66///
67/// # to_sci_with_options
68/// ```
69/// use malachite_base::num::conversion::string::options::ToSciOptions;
70/// use malachite_base::num::conversion::traits::ToSci;
71/// use malachite_base::rounding_modes::RoundingMode::*;
72///
73/// let mut options = ToSciOptions::default();
74/// assert_eq!(123456u32.to_sci_with_options(options).to_string(), "123456");
75///
76/// options.set_precision(3);
77/// assert_eq!(123456u32.to_sci_with_options(options).to_string(), "1.23e5");
78///
79/// options.set_rounding_mode(Ceiling);
80/// assert_eq!(123456u32.to_sci_with_options(options).to_string(), "1.24e5");
81///
82/// options.set_e_uppercase();
83/// assert_eq!(123456u32.to_sci_with_options(options).to_string(), "1.24E5");
84///
85/// options.set_force_exponent_plus_sign(true);
86/// assert_eq!(
87/// 123456u32.to_sci_with_options(options).to_string(),
88/// "1.24E+5"
89/// );
90///
91/// options = ToSciOptions::default();
92/// options.set_base(36);
93/// assert_eq!(123456u32.to_sci_with_options(options).to_string(), "2n9c");
94///
95/// options.set_uppercase();
96/// assert_eq!(123456u32.to_sci_with_options(options).to_string(), "2N9C");
97///
98/// options.set_base(2);
99/// options.set_precision(10);
100/// assert_eq!(
101/// 123456u32.to_sci_with_options(options).to_string(),
102/// "1.1110001e16"
103/// );
104///
105/// options.set_include_trailing_zeros(true);
106/// assert_eq!(
107/// 123456u32.to_sci_with_options(options).to_string(),
108/// "1.111000100e16"
109/// );
110/// ```
111///
112/// # fmt_sci_valid
113/// ```
114/// use malachite_base::num::conversion::string::options::ToSciOptions;
115/// use malachite_base::num::conversion::traits::ToSci;
116/// use malachite_base::rounding_modes::RoundingMode::*;
117///
118/// let mut options = ToSciOptions::default();
119/// assert!(123u8.fmt_sci_valid(options));
120/// assert!(u128::MAX.fmt_sci_valid(options));
121/// options.set_rounding_mode(Exact);
122/// assert!(!u128::MAX.fmt_sci_valid(options)); // u128::MAX has more than 16 significant digits
123/// options.set_precision(50);
124/// assert!(u128::MAX.fmt_sci_valid(options));
125/// ```
126pub mod to_sci;
127/// The [`BaseFmtWrapper`](to_string::BaseFmtWrapper) struct and
128/// [`ToStringBase`](super::traits::ToStringBase) trait, used for converting numbers to strings.
129///
130/// # Display::fmt for BaseFmtWrapper
131/// ```
132/// use malachite_base::num::conversion::string::to_string::BaseFmtWrapper;
133///
134/// let x = BaseFmtWrapper::new(1000000000u32, 36);
135/// assert_eq!(format!("{}", x), "gjdgxs");
136/// assert_eq!(format!("{:#}", x), "GJDGXS");
137/// assert_eq!(format!("{:010}", x), "0000gjdgxs");
138/// assert_eq!(format!("{:#010}", x), "0000GJDGXS");
139///
140/// let x = BaseFmtWrapper::new(-1000000000i32, 36);
141/// assert_eq!(format!("{}", x), "-gjdgxs");
142/// assert_eq!(format!("{:#}", x), "-GJDGXS");
143/// assert_eq!(format!("{:010}", x), "-000gjdgxs");
144/// assert_eq!(format!("{:#010}", x), "-000GJDGXS");
145/// ```
146///
147/// # Debug::fmt for BaseFmtWrapper
148/// ```
149/// use malachite_base::num::conversion::string::to_string::BaseFmtWrapper;
150///
151/// let x = BaseFmtWrapper::new(1000000000u32, 36);
152/// assert_eq!(format!("{:?}", x), "gjdgxs");
153/// assert_eq!(format!("{:#?}", x), "GJDGXS");
154/// assert_eq!(format!("{:010?}", x), "0000gjdgxs");
155/// assert_eq!(format!("{:#010?}", x), "0000GJDGXS");
156///
157/// let x = BaseFmtWrapper::new(-1000000000i32, 36);
158/// assert_eq!(format!("{:?}", x), "-gjdgxs");
159/// assert_eq!(format!("{:#?}", x), "-GJDGXS");
160/// assert_eq!(format!("{:010?}", x), "-000gjdgxs");
161/// assert_eq!(format!("{:#010?}", x), "-000GJDGXS");
162/// ```
163///
164/// # to_string_base
165/// ```
166/// use malachite_base::num::conversion::traits::ToStringBase;
167///
168/// assert_eq!(1000u16.to_string_base(2), "1111101000");
169/// assert_eq!(1000u16.to_string_base(10), "1000");
170/// assert_eq!(1000u16.to_string_base(36), "rs");
171///
172/// assert_eq!(1000i16.to_string_base(2), "1111101000");
173/// assert_eq!(1000i16.to_string_base(10), "1000");
174/// assert_eq!(1000i16.to_string_base(36), "rs");
175///
176/// assert_eq!((-1000i16).to_string_base(2), "-1111101000");
177/// assert_eq!((-1000i16).to_string_base(10), "-1000");
178/// assert_eq!((-1000i16).to_string_base(36), "-rs");
179/// ```
180///
181/// # to_string_base_upper
182/// ```
183/// use malachite_base::num::conversion::traits::ToStringBase;
184///
185/// assert_eq!(1000u16.to_string_base_upper(2), "1111101000");
186/// assert_eq!(1000u16.to_string_base_upper(10), "1000");
187/// assert_eq!(1000u16.to_string_base_upper(36), "RS");
188///
189/// assert_eq!(1000i16.to_string_base_upper(2), "1111101000");
190/// assert_eq!(1000i16.to_string_base_upper(10), "1000");
191/// assert_eq!(1000i16.to_string_base_upper(36), "RS");
192///
193/// assert_eq!((-1000i16).to_string_base_upper(2), "-1111101000");
194/// assert_eq!((-1000i16).to_string_base_upper(10), "-1000");
195/// assert_eq!((-1000i16).to_string_base_upper(36), "-RS");
196/// ```
197pub mod to_string;