lexical_util/feature_format.rs
1//! Configuration options for parsing and formatting numbers.
2//!
3//! This comprises 2 parts: a low-level API for generating packed structs
4//! containing enumerating for number formats (both syntax and lexer).
5//!
6//! # Syntax Format
7//!
8//! The syntax format defines **which** numeric string are valid.
9//! For example, if exponent notation is required or not
10//! allowed.
11//!
12//! # Control Format
13//!
14//! The control format defines what characters are valid, that is, which
15//! characters should be consider valid to continue tokenization.
16
17#![cfg(feature = "format")]
18
19use crate::error::Error;
20use crate::format_builder::NumberFormatBuilder;
21use crate::format_flags as flags;
22
23/// Add multiple flags to `SyntaxFormat`.
24macro_rules! from_flag {
25 ($format:ident, $flag:ident) => {{
26 $format & flags::$flag != 0
27 }};
28}
29
30/// Helper to access features from the packed format struct.
31///
32/// This contains accessory methods to read the formatting settings
33/// without using bitmasks directly on the underlying packed struct.
34///
35/// Some of the core functionality includes support for:
36/// - Digit separators: ignored characters used to make numbers more readable,
37/// such as `100,000`.
38/// - Non-decimal radixes: writing or parsing numbers written in binary,
39/// hexadecimal, or other bases.
40/// - Special numbers: disabling support for special floating-point, such as
41/// [`NaN`][f64::NAN].
42/// - Number components: require signs, significant digits, and more.
43///
44/// This should always be constructed via [`NumberFormatBuilder`].
45/// See [`NumberFormatBuilder`] for the fields for the packed struct.
46///
47/// # Examples
48///
49/// ```rust
50/// # #[cfg(feature = "format")] {
51/// use lexical_util::format::{RUST_LITERAL, NumberFormat};
52///
53/// let format = NumberFormat::<{ RUST_LITERAL }> {};
54/// assert!(format.no_positive_mantissa_sign());
55/// assert!(format.no_special());
56/// assert!(format.internal_digit_separator());
57/// assert!(format.trailing_digit_separator());
58/// assert!(format.consecutive_digit_separator());
59/// assert!(!format.no_exponent_notation());
60/// # }
61/// ```
62pub struct NumberFormat<const FORMAT: u128>;
63
64#[rustfmt::skip]
65impl<const FORMAT: u128> NumberFormat<FORMAT> {
66 // CONSTRUCTORS
67
68 /// Create new instance (for methods and validation).
69 ///
70 /// This uses the same settings as in the `FORMAT` packed struct.
71 #[inline(always)]
72 pub const fn new() -> Self {
73 Self {}
74 }
75
76 // VALIDATION
77
78 /// Determine if the number format is valid.
79 #[inline(always)]
80 pub const fn is_valid(&self) -> bool {
81 self.error().is_success()
82 }
83
84 /// Get the error type from the format.
85 ///
86 /// If [`Error::Success`] is returned, then no error occurred.
87 #[inline(always)]
88 pub const fn error(&self) -> Error {
89 format_error_impl(FORMAT)
90 }
91
92 /// Determine if the radixes in the number format are valid.
93 #[inline(always)]
94 pub const fn is_valid_radix(&self) -> bool {
95 self.error_radix().is_success()
96 }
97
98 /// Get the error type from the radix-only for the format.
99 ///
100 /// If [`Error::Success`] is returned, then no error occurred.
101 #[inline(always)]
102 pub const fn error_radix(&self) -> Error {
103 radix_error_impl(FORMAT)
104 }
105
106 // NON-DIGIT SEPARATOR FLAGS & MASKS
107
108 /// If digits are required before the decimal point.
109 ///
110 /// See [`required_integer_digits`][Self::required_integer_digits].
111 pub const REQUIRED_INTEGER_DIGITS: bool = from_flag!(FORMAT, REQUIRED_INTEGER_DIGITS);
112
113 /// Get if digits are required before the decimal point.
114 ///
115 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
116 /// to [`false`].
117 ///
118 /// # Examples
119 ///
120 /// | Input | Valid? |
121 /// |:-:|:-:|
122 /// | `1.1` | ✔️ |
123 /// | `0.1` | ✔️ |
124 /// | `1` | ✔️ |
125 /// | `.1` | ❌ |
126 ///
127 /// # Used For
128 ///
129 /// - Parse Float
130 #[inline(always)]
131 pub const fn required_integer_digits(&self) -> bool {
132 Self::REQUIRED_INTEGER_DIGITS
133 }
134
135 /// If digits are required after the decimal point.
136 ///
137 /// See [`required_fraction_digits`][Self::required_fraction_digits].
138 pub const REQUIRED_FRACTION_DIGITS: bool = from_flag!(FORMAT, REQUIRED_FRACTION_DIGITS);
139
140 /// Get if digits are required after the decimal point.
141 ///
142 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
143 /// to [`false`].
144 ///
145 /// # Examples
146 ///
147 /// | Input | Valid? |
148 /// |:-:|:-:|
149 /// | `1.1` | ✔️ |
150 /// | `1` | ✔️ |
151 /// | `1.` | ❌ |
152 ///
153 /// # Used For
154 ///
155 /// - Parse Float
156 #[inline(always)]
157 pub const fn required_fraction_digits(&self) -> bool {
158 Self::REQUIRED_FRACTION_DIGITS
159 }
160
161 /// If digits are required after the exponent character.
162 ///
163 /// See [`required_exponent_digits`][Self::required_exponent_digits].
164 pub const REQUIRED_EXPONENT_DIGITS: bool = from_flag!(FORMAT, REQUIRED_EXPONENT_DIGITS);
165
166 /// Get if digits are required after the exponent character.
167 ///
168 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
169 /// to [`true`].
170 ///
171 /// # Examples
172 ///
173 /// | Input | Valid? |
174 /// |:-:|:-:|
175 /// | `1.1e+3` | ✔️ |
176 /// | `1.1e3` | ✔️ |
177 /// | `1.1e+` | ❌ |
178 /// | `1.1e` | ❌ |
179 ///
180 /// # Used For
181 ///
182 /// - Parse Float
183 #[inline(always)]
184 pub const fn required_exponent_digits(&self) -> bool {
185 Self::REQUIRED_EXPONENT_DIGITS
186 }
187
188 /// If significant digits are required.
189 ///
190 /// See [`required_mantissa_digits`][Self::required_mantissa_digits].
191 pub const REQUIRED_MANTISSA_DIGITS: bool = from_flag!(FORMAT, REQUIRED_MANTISSA_DIGITS);
192
193 /// Get if at least 1 significant digit is required.
194 ///
195 /// If not required, then values like `.` (`0`) are valid, but empty strings
196 /// are still invalid. Can only be modified with [`feature`][crate#features]
197 /// `format`. Defaults to [`true`].
198 ///
199 /// # Examples
200 ///
201 /// | Input | Valid? |
202 /// |:-:|:-:|
203 /// | `1.1` | ✔️ |
204 /// | `.` | ✔️ |
205 /// | `e10` | ✔️ |
206 /// | `.e10` | ✔️ |
207 /// | `` | ❌ |
208 ///
209 /// # Used For
210 ///
211 /// - Parse Float
212 #[inline(always)]
213 pub const fn required_mantissa_digits(&self) -> bool {
214 Self::REQUIRED_MANTISSA_DIGITS
215 }
216
217 /// If at least 1 digit in the number is required.
218 ///
219 /// See [`required_digits`][Self::required_digits].
220 pub const REQUIRED_DIGITS: bool = from_flag!(FORMAT, REQUIRED_DIGITS);
221
222 /// Get if at least 1 digit in the number is required.
223 ///
224 /// This requires either [`mantissa`] or [`exponent`] digits.
225 ///
226 /// [`mantissa`]: Self::required_mantissa_digits
227 /// [`exponent`]: Self::required_exponent_digits
228 #[inline(always)]
229 pub const fn required_digits(&self) -> bool {
230 Self::REQUIRED_DIGITS
231 }
232
233 /// If a positive sign before the mantissa is not allowed.
234 ///
235 /// See [`no_positive_mantissa_sign`][Self::no_positive_mantissa_sign].
236 pub const NO_POSITIVE_MANTISSA_SIGN: bool = from_flag!(FORMAT, NO_POSITIVE_MANTISSA_SIGN);
237
238 /// Get if a positive sign before the mantissa is not allowed.
239 ///
240 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
241 /// to `false`.
242 ///
243 /// # Examples
244 ///
245 /// | Input | Valid? |
246 /// |:-:|:-:|
247 /// | `1.1` | ✔️ |
248 /// | `-1.1` | ✔️ |
249 /// | `+1.1` | ❌ |
250 ///
251 /// # Used For
252 ///
253 /// - Parse Float
254 /// - Parse Integer
255 /// - Write Float
256 #[inline(always)]
257 pub const fn no_positive_mantissa_sign(&self) -> bool {
258 Self::NO_POSITIVE_MANTISSA_SIGN
259 }
260
261 /// If a sign symbol before the mantissa is required.
262 ///
263 /// See [`required_mantissa_sign`][Self::required_mantissa_sign].
264 pub const REQUIRED_MANTISSA_SIGN: bool = from_flag!(FORMAT, REQUIRED_MANTISSA_SIGN);
265
266 /// Get if a sign symbol before the mantissa is required.
267 ///
268 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
269 /// to `false`.
270 ///
271 /// # Examples
272 ///
273 /// | Input | Valid? |
274 /// |:-:|:-:|
275 /// | `1.1` | ❌ |
276 /// | `-1.1` | ✔️ |
277 /// | `+1.1` | ✔️ |
278 ///
279 /// # Used For
280 ///
281 /// - Parse Float
282 /// - Parse Integer
283 /// - Write Float
284 #[inline(always)]
285 pub const fn required_mantissa_sign(&self) -> bool {
286 Self::REQUIRED_MANTISSA_SIGN
287 }
288
289 /// If exponent notation is not allowed.
290 ///
291 /// See [`no_exponent_notation`][Self::no_exponent_notation].
292 pub const NO_EXPONENT_NOTATION: bool = from_flag!(FORMAT, NO_EXPONENT_NOTATION);
293
294 /// Get if exponent notation is not allowed.
295 ///
296 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
297 /// to `false`.
298 ///
299 /// # Examples
300 ///
301 /// | Input | Valid? |
302 /// |:-:|:-:|
303 /// | `1` | ✔️ |
304 /// | `1.1` | ✔️ |
305 /// | `1.1e` | ❌ |
306 /// | `1.1e5` | ❌ |
307 ///
308 /// # Used For
309 ///
310 /// - Parse Float
311 /// - Write Float
312 #[inline(always)]
313 pub const fn no_exponent_notation(&self) -> bool {
314 Self::NO_EXPONENT_NOTATION
315 }
316
317 /// If a positive sign before the exponent is not allowed.
318 ///
319 /// See [`no_positive_exponent_sign`][Self::no_positive_exponent_sign].
320 pub const NO_POSITIVE_EXPONENT_SIGN: bool = from_flag!(FORMAT, NO_POSITIVE_EXPONENT_SIGN);
321
322 /// Get if a positive sign before the exponent is not allowed.
323 ///
324 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
325 /// to `false`.
326 ///
327 /// # Examples
328 ///
329 /// | Input | Valid? |
330 /// |:-:|:-:|
331 /// | `1.1e3` | ✔️ |
332 /// | `1.1e-3` | ✔️ |
333 /// | `1.1e+3` | ❌ |
334 ///
335 /// # Used For
336 ///
337 /// - Parse Float
338 /// - Write Float
339 #[inline(always)]
340 pub const fn no_positive_exponent_sign(&self) -> bool {
341 Self::NO_POSITIVE_EXPONENT_SIGN
342 }
343
344 /// If a sign symbol before the exponent is required.
345 ///
346 /// See [`required_exponent_sign`][Self::required_exponent_sign].
347 pub const REQUIRED_EXPONENT_SIGN: bool = from_flag!(FORMAT, REQUIRED_EXPONENT_SIGN);
348
349 /// Get if a sign symbol before the exponent is required.
350 ///
351 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
352 /// to `false`.
353 ///
354 /// # Examples
355 ///
356 /// | Input | Valid? |
357 /// |:-:|:-:|
358 /// | `1.1e3` | ❌ |
359 /// | `1.1e-3` | ✔️ |
360 /// | `1.1e+3` | ✔️ |
361 ///
362 /// # Used For
363 ///
364 /// - Parse Float
365 /// - Write Float
366 #[inline(always)]
367 pub const fn required_exponent_sign(&self) -> bool {
368 Self::REQUIRED_EXPONENT_SIGN
369 }
370
371 /// If an exponent without fraction is not allowed.
372 ///
373 /// See [`no_exponent_without_fraction`][Self::no_exponent_without_fraction].
374 pub const NO_EXPONENT_WITHOUT_FRACTION: bool = from_flag!(FORMAT, NO_EXPONENT_WITHOUT_FRACTION);
375
376 /// Get if an exponent without fraction is not allowed.
377 ///
378 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
379 /// to `false`.
380 ///
381 /// # Examples
382 ///
383 /// | Input | Valid? |
384 /// |:-:|:-:|
385 /// | `1e3` | ❌ |
386 /// | `1.e3` | ❌ |
387 /// | `1.1e` | ✔️ |
388 /// | `.1e3` | ✔️ |
389 ///
390 /// # Used For
391 ///
392 /// - Parse Float
393 #[inline(always)]
394 pub const fn no_exponent_without_fraction(&self) -> bool {
395 Self::NO_EXPONENT_WITHOUT_FRACTION
396 }
397
398 /// If special (non-finite) values are not allowed.
399 ///
400 /// See [`no_special`][Self::no_special].
401 pub const NO_SPECIAL: bool = from_flag!(FORMAT, NO_SPECIAL);
402
403 /// Get if special (non-finite) values are not allowed.
404 ///
405 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
406 /// to `false`.
407 ///
408 /// # Examples
409 ///
410 /// | Input | Valid? |
411 /// |:-:|:-:|
412 /// | `NaN` | ❌ |
413 /// | `inf` | ❌ |
414 /// | `-Infinity` | ❌ |
415 /// | `1.1e` | ✔️ |
416 ///
417 /// # Used For
418 ///
419 /// - Parse Float
420 #[inline(always)]
421 pub const fn no_special(&self) -> bool {
422 Self::NO_SPECIAL
423 }
424
425 /// If special (non-finite) values are case-sensitive.
426 ///
427 /// See [`case_sensitive_special`][Self::case_sensitive_special].
428 pub const CASE_SENSITIVE_SPECIAL: bool = from_flag!(FORMAT, CASE_SENSITIVE_SPECIAL);
429
430 /// Get if special (non-finite) values are case-sensitive.
431 ///
432 /// If set to [`true`], then `NaN` and `nan` are treated as the same value
433 /// ([Not a Number][f64::NAN]). Can only be modified with
434 /// [`feature`][crate#features] `format`. Defaults to [`false`].
435 ///
436 /// # Used For
437 ///
438 /// - Parse Float
439 #[inline(always)]
440 pub const fn case_sensitive_special(&self) -> bool {
441 Self::CASE_SENSITIVE_SPECIAL
442 }
443
444 /// If leading zeros before an integer are not allowed.
445 ///
446 /// See [`no_integer_leading_zeros`][Self::no_integer_leading_zeros].
447 pub const NO_INTEGER_LEADING_ZEROS: bool = from_flag!(FORMAT, NO_INTEGER_LEADING_ZEROS);
448
449 /// Get if leading zeros before an integer are not allowed.
450 ///
451 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
452 /// to [`false`].
453 ///
454 /// # Examples
455 ///
456 /// | Input | Valid? |
457 /// |:-:|:-:|
458 /// | `01` | ❌ |
459 /// | `0` | ✔️ |
460 /// | `10` | ✔️ |
461 ///
462 /// # Used For
463 ///
464 /// - Parse Integer
465 #[inline(always)]
466 pub const fn no_integer_leading_zeros(&self) -> bool {
467 Self::NO_INTEGER_LEADING_ZEROS
468 }
469
470 /// If leading zeros before a float are not allowed.
471 ///
472 /// See [`no_float_leading_zeros`][Self::no_float_leading_zeros].
473 pub const NO_FLOAT_LEADING_ZEROS: bool = from_flag!(FORMAT, NO_FLOAT_LEADING_ZEROS);
474
475 /// Get if leading zeros before a float are not allowed.
476 ///
477 /// This is before the significant digits of the float, that is, if there is
478 /// 1 or more digits in the integral component and the leading digit is 0,
479 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
480 /// to [`false`].
481 ///
482 /// # Examples
483 ///
484 /// | Input | Valid? |
485 /// |:-:|:-:|
486 /// | `01` | ❌ |
487 /// | `01.0` | ❌ |
488 /// | `0` | ✔️ |
489 /// | `10` | ✔️ |
490 /// | `0.1` | ✔️ |
491 ///
492 /// # Used For
493 ///
494 /// - Parse Float
495 #[inline(always)]
496 pub const fn no_float_leading_zeros(&self) -> bool {
497 Self::NO_FLOAT_LEADING_ZEROS
498 }
499
500 /// If exponent notation is required.
501 ///
502 /// See [`required_exponent_notation`][Self::required_exponent_notation].
503 pub const REQUIRED_EXPONENT_NOTATION: bool = from_flag!(FORMAT, REQUIRED_EXPONENT_NOTATION);
504
505 /// Get if exponent notation is required.
506 ///
507 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
508 /// to [`false`].
509 ///
510 /// # Examples
511 ///
512 /// | Input | Valid? |
513 /// |:-:|:-:|
514 /// | `1` | ❌ |
515 /// | `1.0` | ❌ |
516 /// | `1e3` | ✔️ |
517 /// | `1.1e3` | ✔️ |
518 ///
519 /// # Used For
520 ///
521 /// - Parse Float
522 /// - Write Float
523 #[inline(always)]
524 pub const fn required_exponent_notation(&self) -> bool {
525 Self::REQUIRED_EXPONENT_NOTATION
526 }
527
528 /// If exponent characters are case-sensitive.
529 ///
530 /// See [`case_sensitive_exponent`][Self::case_sensitive_exponent].
531 pub const CASE_SENSITIVE_EXPONENT: bool = from_flag!(FORMAT, CASE_SENSITIVE_EXPONENT);
532
533 /// Get if exponent characters are case-sensitive.
534 ///
535 /// If set to [`true`], then the exponent character `e` would be considered
536 /// the different from `E`. Can only be modified with
537 /// [`feature`][crate#features] `format`. Defaults to [`false`].
538 ///
539 /// # Used For
540 ///
541 /// - Parse Float
542 #[inline(always)]
543 pub const fn case_sensitive_exponent(&self) -> bool {
544 Self::CASE_SENSITIVE_EXPONENT
545 }
546
547 /// If base prefixes are case-sensitive.
548 ///
549 /// See [`case_sensitive_base_prefix`][Self::case_sensitive_base_prefix].
550 pub const CASE_SENSITIVE_BASE_PREFIX: bool = from_flag!(FORMAT, CASE_SENSITIVE_BASE_PREFIX);
551
552 /// Get if base prefixes are case-sensitive.
553 ///
554 /// If set to [`true`], then the base prefix `x` would be considered the
555 /// different from `X`. Can only be modified with
556 /// [`feature`][crate#features] `power-of-two` or `radix` along with
557 /// `format`. Defaults to [`false`].
558 ///
559 /// # Used For
560 ///
561 /// - Parse Float
562 /// - Parse Integer
563 #[inline(always)]
564 pub const fn case_sensitive_base_prefix(&self) -> bool {
565 Self::CASE_SENSITIVE_BASE_PREFIX
566 }
567
568 /// If base suffixes are case-sensitive.
569 ///
570 /// See [`case_sensitive_base_suffix`][Self::case_sensitive_base_suffix].
571 pub const CASE_SENSITIVE_BASE_SUFFIX: bool = from_flag!(FORMAT, CASE_SENSITIVE_BASE_SUFFIX);
572
573 /// Get if base suffixes are case-sensitive.
574 ///
575 /// If set to [`true`], then the base suffix `x` would be considered the
576 /// different from `X`. Can only be modified with
577 /// [`feature`][crate#features] `power-of-two` or `radix` along with
578 /// `format`. Defaults to [`false`].
579 ///
580 /// # Used For
581 ///
582 /// - Parse Float
583 /// - Parse Integer
584 #[inline(always)]
585 pub const fn case_sensitive_base_suffix(&self) -> bool {
586 Self::CASE_SENSITIVE_BASE_SUFFIX
587 }
588
589 // DIGIT SEPARATOR FLAGS & MASKS
590
591 /// If digit separators are allowed between integer digits.
592 ///
593 /// This will not consider an input of only the digit separator
594 /// to be a valid separator: the digit separator must be surrounded by
595 /// digits.
596 ///
597 /// See [`integer_internal_digit_separator`][Self::integer_internal_digit_separator].
598 pub const INTEGER_INTERNAL_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, INTEGER_INTERNAL_DIGIT_SEPARATOR);
599
600 /// Get if digit separators are allowed between integer digits.
601 ///
602 /// This will not consider an input of only the digit separator
603 /// to be a valid separator: the digit separator must be surrounded by
604 /// digits. Can only be modified with [`feature`][crate#features] `format`.
605 /// Defaults to [`false`].
606 ///
607 /// # Examples
608 ///
609 /// Using a digit separator of `_`.
610 ///
611 /// | Input | Valid? |
612 /// |:-:|:-:|
613 /// | `1` | ✔️ |
614 /// | `_` | ❌ |
615 /// | `1_1` | ✔️ |
616 /// | `1_` | ❌ |
617 /// | `_1` | ❌ |
618 ///
619 /// # Used For
620 ///
621 /// - Parse Float
622 /// - Parse Integer
623 #[inline(always)]
624 pub const fn integer_internal_digit_separator(&self) -> bool {
625 Self::INTEGER_INTERNAL_DIGIT_SEPARATOR
626 }
627
628 /// If digit separators are allowed between fraction digits.
629 ///
630 /// This will not consider an input of only the digit separator
631 /// to be a valid separator: the digit separator must be surrounded by
632 /// digits.
633 ///
634 /// See [`fraction_internal_digit_separator`][Self::fraction_internal_digit_separator].
635 pub const FRACTION_INTERNAL_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, FRACTION_INTERNAL_DIGIT_SEPARATOR);
636
637 /// Get if digit separators are allowed between fraction digits.
638 ///
639 /// This will not consider an input of only the digit separator
640 /// to be a valid separator: the digit separator must be surrounded by
641 /// digits. Can only be modified with [`feature`][crate#features] `format`.
642 /// Defaults to [`false`].
643 ///
644 /// # Examples
645 ///
646 /// Using a digit separator of `_`.
647 ///
648 /// | Input | Valid? |
649 /// |:-:|:-:|
650 /// | `1.1` | ✔️ |
651 /// | `1._` | ❌ |
652 /// | `1.1_1` | ✔️ |
653 /// | `1.1_` | ❌ |
654 /// | `1._1` | ❌ |
655 ///
656 /// # Used For
657 ///
658 /// - Parse Float
659 #[inline(always)]
660 pub const fn fraction_internal_digit_separator(&self) -> bool {
661 Self::FRACTION_INTERNAL_DIGIT_SEPARATOR
662 }
663
664 /// If digit separators are allowed between exponent digits.
665 ///
666 /// This will not consider an input of only the digit separator
667 /// to be a valid separator: the digit separator must be surrounded by
668 /// digits.
669 ///
670 /// See [`exponent_internal_digit_separator`][Self::exponent_internal_digit_separator].
671 pub const EXPONENT_INTERNAL_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, EXPONENT_INTERNAL_DIGIT_SEPARATOR);
672
673 /// Get if digit separators are allowed between exponent digits.
674 ///
675 /// This will not consider an input of only the digit separator
676 /// to be a valid separator: the digit separator must be surrounded by
677 /// digits. Can only be modified with [`feature`][crate#features] `format`.
678 /// Defaults to [`false`].
679 ///
680 /// # Examples
681 ///
682 /// Using a digit separator of `_`.
683 ///
684 /// | Input | Valid? |
685 /// |:-:|:-:|
686 /// | `1.1e1` | ✔️ |
687 /// | `1.1e_` | ❌ |
688 /// | `1.1e1_1` | ✔️ |
689 /// | `1.1e1_` | ❌ |
690 /// | `1.1e_1` | ❌ |
691 ///
692 /// # Used For
693 ///
694 /// - Parse Float
695 #[inline(always)]
696 pub const fn exponent_internal_digit_separator(&self) -> bool {
697 Self::EXPONENT_INTERNAL_DIGIT_SEPARATOR
698 }
699
700 /// If digit separators are allowed between digits.
701 ///
702 /// This will not consider an input of only the digit separator
703 /// to be a valid separator: the digit separator must be surrounded by
704 /// digits.
705 ///
706 /// See [`internal_digit_separator`][Self::internal_digit_separator].
707 pub const INTERNAL_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, INTERNAL_DIGIT_SEPARATOR);
708
709 /// Get if digit separators are allowed between digits.
710 ///
711 /// This will not consider an input of only the digit separator
712 /// to be a valid separator: the digit separator must be surrounded by
713 /// digits. This is equivalent to any of [`integer_internal_digit_separator`],
714 /// [`fraction_internal_digit_separator`], or
715 /// [`exponent_internal_digit_separator`] being set.
716 ///
717 /// [`integer_internal_digit_separator`]: Self::integer_internal_digit_separator
718 /// [`fraction_internal_digit_separator`]: Self::fraction_internal_digit_separator
719 /// [`exponent_internal_digit_separator`]: Self::exponent_internal_digit_separator
720 #[inline(always)]
721 pub const fn internal_digit_separator(&self) -> bool {
722 Self::INTERNAL_DIGIT_SEPARATOR
723 }
724
725 /// If a digit separator is allowed before any integer digits.
726 ///
727 /// This will consider an input of only the digit separator
728 /// to be a identical to empty input.
729 ///
730 /// See [`integer_leading_digit_separator`][Self::integer_leading_digit_separator].
731 pub const INTEGER_LEADING_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, INTEGER_LEADING_DIGIT_SEPARATOR);
732
733 /// Get if a digit separator is allowed before any integer digits.
734 ///
735 /// This will consider an input of only the digit separator
736 /// to be a identical to empty input. Can only be modified with
737 /// [`feature`][crate#features] `format`. Defaults to [`false`].
738 ///
739 /// # Examples
740 ///
741 /// Using a digit separator of `_`.
742 ///
743 /// | Input | Valid? |
744 /// |:-:|:-:|
745 /// | `1` | ✔️ |
746 /// | `_` | ❌ |
747 /// | `1_1` | ❌ |
748 /// | `1_` | ❌ |
749 /// | `_1` | ✔️ |
750 ///
751 /// # Used For
752 ///
753 /// - Parse Float
754 /// - Parse Integer
755 #[inline(always)]
756 pub const fn integer_leading_digit_separator(&self) -> bool {
757 Self::INTEGER_LEADING_DIGIT_SEPARATOR
758 }
759
760 /// If a digit separator is allowed before any integer digits.
761 ///
762 /// This will consider an input of only the digit separator
763 /// to be a identical to empty input.
764 ///
765 /// See [`fraction_leading_digit_separator`][Self::fraction_leading_digit_separator].
766 pub const FRACTION_LEADING_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, FRACTION_LEADING_DIGIT_SEPARATOR);
767
768 /// Get if a digit separator is allowed before any fraction digits.
769 ///
770 /// This will consider an input of only the digit separator
771 /// to be a identical to empty input. Can only be modified with
772 /// [`feature`][crate#features] `format`. Defaults to [`false`].
773 ///
774 /// # Examples
775 ///
776 /// Using a digit separator of `_`.
777 ///
778 /// | Input | Valid? |
779 /// |:-:|:-:|
780 /// | `1.1` | ✔️ |
781 /// | `1._` | ❌ |
782 /// | `1.1_1` | ❌ |
783 /// | `1.1_` | ❌ |
784 /// | `1._1` | ✔️ |
785 ///
786 /// # Used For
787 ///
788 /// - Parse Float
789 #[inline(always)]
790 pub const fn fraction_leading_digit_separator(&self) -> bool {
791 Self::FRACTION_LEADING_DIGIT_SEPARATOR
792 }
793
794 /// If a digit separator is allowed before any exponent digits.
795 ///
796 /// This will consider an input of only the digit separator
797 /// to be a identical to empty input.
798 ///
799 /// See [`exponent_leading_digit_separator`][Self::exponent_leading_digit_separator].
800 pub const EXPONENT_LEADING_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, EXPONENT_LEADING_DIGIT_SEPARATOR);
801
802 /// Get if a digit separator is allowed before any exponent digits.
803 ///
804 /// This will consider an input of only the digit separator
805 /// to be a identical to empty input. Can only be modified with
806 /// [`feature`][crate#features] `format`. Defaults to [`false`].
807 ///
808 /// # Examples
809 ///
810 /// Using a digit separator of `_`.
811 ///
812 /// | Input | Valid? |
813 /// |:-:|:-:|
814 /// | `1.1e1` | ✔️ |
815 /// | `1.1e_` | ❌ |
816 /// | `1.1e1_1` | ❌ |
817 /// | `1.1e1_` | ❌ |
818 /// | `1.1e_1` | ✔️ |
819 ///
820 /// # Used For
821 ///
822 /// - Parse Float
823 #[inline(always)]
824 pub const fn exponent_leading_digit_separator(&self) -> bool {
825 Self::EXPONENT_LEADING_DIGIT_SEPARATOR
826 }
827
828 /// If a digit separator is allowed before any digits.
829 ///
830 /// This will consider an input of only the digit separator
831 /// to be a identical to empty input.
832 ///
833 /// See [`leading_digit_separator`][Self::leading_digit_separator].
834 pub const LEADING_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, LEADING_DIGIT_SEPARATOR);
835
836 /// Get if a digit separator is allowed before any digits.
837 ///
838 /// This will consider an input of only the digit separator
839 /// to be a identical to empty input. This is equivalent to
840 /// any of [`integer_leading_digit_separator`],
841 /// [`fraction_leading_digit_separator`], or
842 /// [`exponent_leading_digit_separator`] being set.
843 ///
844 /// [`integer_leading_digit_separator`]: Self::integer_leading_digit_separator
845 /// [`fraction_leading_digit_separator`]: Self::fraction_leading_digit_separator
846 /// [`exponent_leading_digit_separator`]: Self::exponent_leading_digit_separator
847 #[inline(always)]
848 pub const fn leading_digit_separator(&self) -> bool {
849 Self::LEADING_DIGIT_SEPARATOR
850 }
851
852 /// If a digit separator is allowed after any integer digits.
853 ///
854 /// This will consider an input of only the digit separator
855 /// to be a identical to empty input.
856 ///
857 /// See [`integer_trailing_digit_separator`][Self::integer_trailing_digit_separator].
858 pub const INTEGER_TRAILING_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, INTEGER_TRAILING_DIGIT_SEPARATOR);
859
860 /// Get if a digit separator is allowed after any integer digits.
861 ///
862 /// This will consider an input of only the digit separator
863 /// to be a identical to empty input. Can only be modified with
864 /// [`feature`][crate#features] `format`. Defaults to [`false`].
865 ///
866 /// # Examples
867 ///
868 /// Using a digit separator of `_`.
869 ///
870 /// | Input | Valid? |
871 /// |:-:|:-:|
872 /// | `1` | ✔️ |
873 /// | `_` | ❌ |
874 /// | `1_1` | ❌ |
875 /// | `1_` | ✔️ |
876 /// | `_1` | ❌ |
877 ///
878 /// # Used For
879 ///
880 /// - Parse Float
881 /// - Parse Integer
882 #[inline(always)]
883 pub const fn integer_trailing_digit_separator(&self) -> bool {
884 Self::INTEGER_TRAILING_DIGIT_SEPARATOR
885 }
886
887 /// If a digit separator is allowed after any fraction digits.
888 ///
889 /// This will consider an input of only the digit separator
890 /// to be a identical to empty input.
891 ///
892 /// See [`fraction_trailing_digit_separator`][Self::fraction_trailing_digit_separator].
893 pub const FRACTION_TRAILING_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, FRACTION_TRAILING_DIGIT_SEPARATOR);
894
895 /// Get if a digit separator is allowed after any fraction digits.
896 ///
897 /// This will consider an input of only the digit separator
898 /// to be a identical to empty input. Can only be modified with
899 /// [`feature`][crate#features] `format`. Defaults to [`false`]. # Examples
900 ///
901 /// Using a digit separator of `_`.
902 ///
903 /// | Input | Valid? |
904 /// |:-:|:-:|
905 /// | `1.1` | ✔️ |
906 /// | `1._` | ❌ |
907 /// | `1.1_1` | ❌ |
908 /// | `1.1_` | ✔️ |
909 /// | `1._1` | ❌ |
910 ///
911 /// # Used For
912 ///
913 /// - Parse Float
914 #[inline(always)]
915 pub const fn fraction_trailing_digit_separator(&self) -> bool {
916 Self::FRACTION_TRAILING_DIGIT_SEPARATOR
917 }
918
919 /// If a digit separator is allowed after any exponent digits.
920 ///
921 /// This will consider an input of only the digit separator
922 /// to be a identical to empty input.
923 ///
924 /// See [`exponent_trailing_digit_separator`][Self::exponent_trailing_digit_separator].
925 pub const EXPONENT_TRAILING_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, EXPONENT_TRAILING_DIGIT_SEPARATOR);
926
927 /// Get if a digit separator is allowed after any exponent digits.
928 ///
929 /// This will consider an input of only the digit separator
930 /// to be a identical to empty input. Can only be modified with
931 /// [`feature`][crate#features] `format`. Defaults to [`false`].
932 ///
933 /// # Examples
934 ///
935 /// Using a digit separator of `_`.
936 ///
937 /// | Input | Valid? |
938 /// |:-:|:-:|
939 /// | `1.1e1` | ✔️ |
940 /// | `1.1e_` | ❌ |
941 /// | `1.1e1_1` | ❌ |
942 /// | `1.1e1_` | ✔️ |
943 /// | `1.1e_1` | ❌ |
944 ///
945 /// # Used For
946 ///
947 /// - Parse Float
948 #[inline(always)]
949 pub const fn exponent_trailing_digit_separator(&self) -> bool {
950 Self::EXPONENT_TRAILING_DIGIT_SEPARATOR
951 }
952
953 /// If a digit separator is allowed after any digits.
954 ///
955 /// This will consider an input of only the digit separator
956 /// to be a identical to empty input.
957 ///
958 /// See [`trailing_digit_separator`][Self::trailing_digit_separator].
959 pub const TRAILING_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, TRAILING_DIGIT_SEPARATOR);
960
961 /// Get if a digit separator is allowed after any digits.
962 ///
963 /// This will consider an input of only the digit separator
964 /// to be a identical to empty input. This is equivalent to
965 /// any of [`integer_trailing_digit_separator`],
966 /// [`fraction_trailing_digit_separator`], or
967 /// [`exponent_trailing_digit_separator`] being set.
968 ///
969 /// [`integer_trailing_digit_separator`]: Self::integer_trailing_digit_separator
970 /// [`fraction_trailing_digit_separator`]: Self::fraction_trailing_digit_separator
971 /// [`exponent_trailing_digit_separator`]: Self::exponent_trailing_digit_separator
972 #[inline(always)]
973 pub const fn trailing_digit_separator(&self) -> bool {
974 Self::TRAILING_DIGIT_SEPARATOR
975 }
976
977 /// If multiple consecutive integer digit separators are allowed.
978 ///
979 /// See [`integer_consecutive_digit_separator`][Self::integer_consecutive_digit_separator].
980 pub const INTEGER_CONSECUTIVE_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, INTEGER_CONSECUTIVE_DIGIT_SEPARATOR);
981
982 /// Get if multiple consecutive integer digit separators are allowed.
983 ///
984 /// That is, using `_` as a digit separator `__` would be allowed where any
985 /// digit separators (leading, trailing, internal) are allowed in the
986 /// integer. Can only be modified with [`feature`][crate#features] `format`.
987 /// Defaults to [`false`].
988 ///
989 /// # Used For
990 ///
991 /// - Parse Float
992 /// - Parse Integer
993 #[inline(always)]
994 pub const fn integer_consecutive_digit_separator(&self) -> bool {
995 Self::INTEGER_CONSECUTIVE_DIGIT_SEPARATOR
996 }
997
998 /// If multiple consecutive fraction digit separators are allowed.
999 ///
1000 /// See [`fraction_consecutive_digit_separator`][Self::fraction_consecutive_digit_separator].
1001 pub const FRACTION_CONSECUTIVE_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, FRACTION_CONSECUTIVE_DIGIT_SEPARATOR);
1002
1003 /// Get if multiple consecutive fraction digit separators are allowed.
1004 ///
1005 /// That is, using `_` as a digit separator `__` would be allowed where any
1006 /// digit separators (leading, trailing, internal) are allowed in the
1007 /// fraction. Can only be modified with [`feature`][crate#features]
1008 /// `format`. Defaults to [`false`].
1009 ///
1010 /// # Used For
1011 ///
1012 /// - Parse Float
1013 #[inline(always)]
1014 pub const fn fraction_consecutive_digit_separator(&self) -> bool {
1015 Self::FRACTION_CONSECUTIVE_DIGIT_SEPARATOR
1016 }
1017
1018 /// If multiple consecutive exponent digit separators are allowed.
1019 ///
1020 /// See [`exponent_consecutive_digit_separator`][Self::exponent_consecutive_digit_separator].
1021 pub const EXPONENT_CONSECUTIVE_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, EXPONENT_CONSECUTIVE_DIGIT_SEPARATOR);
1022
1023 /// Get if multiple consecutive exponent digit separators are allowed.
1024 ///
1025 /// That is, using `_` as a digit separator `__` would be allowed where any
1026 /// digit separators (leading, trailing, internal) are allowed in the
1027 /// exponent. Can only be modified with [`feature`][crate#features]
1028 /// `format`. Defaults to [`false`].
1029 ///
1030 /// # Used For
1031 ///
1032 /// - Parse Float
1033 #[inline(always)]
1034 pub const fn exponent_consecutive_digit_separator(&self) -> bool {
1035 Self::EXPONENT_CONSECUTIVE_DIGIT_SEPARATOR
1036 }
1037
1038 /// If multiple consecutive digit separators are allowed.
1039 ///
1040 /// See [`consecutive_digit_separator`][Self::consecutive_digit_separator].
1041 pub const CONSECUTIVE_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, CONSECUTIVE_DIGIT_SEPARATOR);
1042
1043 /// Get if multiple consecutive digit separators are allowed.
1044 ///
1045 /// This is equivalent to any of [`integer_consecutive_digit_separator`],
1046 /// [`fraction_consecutive_digit_separator`], or
1047 /// [`exponent_consecutive_digit_separator`] being set.
1048 ///
1049 /// [`integer_consecutive_digit_separator`]: Self::integer_consecutive_digit_separator
1050 /// [`fraction_consecutive_digit_separator`]: Self::fraction_consecutive_digit_separator
1051 /// [`exponent_consecutive_digit_separator`]: Self::exponent_consecutive_digit_separator
1052 #[inline(always)]
1053 pub const fn consecutive_digit_separator(&self) -> bool {
1054 Self::CONSECUTIVE_DIGIT_SEPARATOR
1055 }
1056
1057 /// If any digit separators are allowed in special (non-finite) values.
1058 ///
1059 /// See [`special_digit_separator`][Self::special_digit_separator].
1060 pub const SPECIAL_DIGIT_SEPARATOR: bool = from_flag!(FORMAT, SPECIAL_DIGIT_SEPARATOR);
1061
1062 /// Get if any digit separators are allowed in special (non-finite) values.
1063 ///
1064 /// This enables leading, trailing, internal, and consecutive digit
1065 /// separators for any special floats: for example, `N__a_N_` is considered
1066 /// the same as `NaN`. Can only be modified with [`feature`][crate#features]
1067 /// `format`. Defaults to [`false`].
1068 ///
1069 /// # Used For
1070 ///
1071 /// - Parse Float
1072 #[inline(always)]
1073 pub const fn special_digit_separator(&self) -> bool {
1074 Self::SPECIAL_DIGIT_SEPARATOR
1075 }
1076
1077 // CHARACTERS
1078
1079 /// The digit separator character in the packed struct.
1080 ///
1081 /// See [`digit_separator`][Self::digit_separator].
1082 pub const DIGIT_SEPARATOR: u8 = flags::digit_separator(FORMAT);
1083
1084 /// Get the digit separator for the number format.
1085 ///
1086 /// Digit separators are frequently used in number literals to group
1087 /// digits: `1,000,000` is a lot more readable than `1000000`, but
1088 /// the `,` characters should be ignored in the parsing of the number.
1089 ///
1090 /// Can only be modified with [`feature`][crate#features] `format`. Defaults
1091 /// to `0`, or no digit separators allowed.
1092 ///
1093 /// # Examples
1094 ///
1095 /// Using a digit separator of `_` (note that the validity
1096 /// oh where a digit separator can appear depends on the other digit
1097 /// separator flags).
1098 ///
1099 /// | Input | Valid? |
1100 /// |:-:|:-:|
1101 /// | `1` | ✔️ |
1102 /// | `1_4` | ✔️ |
1103 /// | `+_14` | ✔️ |
1104 /// | `+14e3_5` | ✔️ |
1105 /// | `1_d` | ❌ |
1106 ///
1107 /// # Used For
1108 ///
1109 /// - Parse Float
1110 /// - Parse Integer
1111 #[inline(always)]
1112 pub const fn digit_separator(&self) -> u8 {
1113 Self::DIGIT_SEPARATOR
1114 }
1115
1116 /// Get if the format has a digit separator.
1117 #[inline(always)]
1118 pub const fn has_digit_separator(&self) -> bool {
1119 self.digit_separator() != 0
1120 }
1121
1122 /// The base prefix character in the packed struct.
1123 ///
1124 /// See [`base_prefix`][Self::base_prefix].
1125 pub const BASE_PREFIX: u8 = flags::base_prefix(FORMAT);
1126
1127 /// Get the optional character for the base prefix.
1128 ///
1129 /// This character will come after a leading zero, so for example
1130 /// setting the base prefix to `x` means that a leading `0x` will
1131 /// be ignore, if present. Can only be modified with
1132 /// [`feature`][crate#features] `power-of-two` or `radix` along with
1133 /// `format`. Defaults to `0`, or no base prefix allowed.
1134 ///
1135 /// # Examples
1136 ///
1137 /// Using a base prefix of `x`.
1138 ///
1139 /// | Input | Valid? |
1140 /// |:-:|:-:|
1141 /// | `0x1` | ✔️ |
1142 /// | `x1` | ❌ |
1143 /// | `1` | ✔️ |
1144 /// | `1x` | ❌ |
1145 /// | `1x1` | ❌ |
1146 ///
1147 /// # Used For
1148 ///
1149 /// - Parse Float
1150 /// - Parse Integer
1151 #[inline(always)]
1152 pub const fn base_prefix(&self) -> u8 {
1153 Self::BASE_PREFIX
1154 }
1155
1156 /// Get if the format has a base suffix.
1157 #[inline(always)]
1158 pub const fn has_base_prefix(&self) -> bool {
1159 self.base_prefix() != 0
1160 }
1161
1162 /// The base suffix character in the packed struct.
1163 ///
1164 /// See [`base_suffix`][Self::base_suffix].
1165 pub const BASE_SUFFIX: u8 = flags::base_suffix(FORMAT);
1166
1167 /// Get the optional character for the base suffix.
1168 ///
1169 /// This character will at the end of the buffer, so for example
1170 /// setting the base prefix to `x` means that a trailing `x` will
1171 /// be ignored, if present. Can only be modified with
1172 /// [`feature`][crate#features] `power-of-two` or `radix` along with
1173 /// `format`. Defaults to `0`, or no base suffix allowed.
1174 ///
1175 /// # Examples
1176 ///
1177 /// Using a base suffix of `x`.
1178 ///
1179 /// | Input | Valid? |
1180 /// |:-:|:-:|
1181 /// | `1` | ✔️ |
1182 /// | `1x` | ✔️ |
1183 /// | `1d` | ❌ |
1184 ///
1185 /// # Used For
1186 ///
1187 /// - Parse Float
1188 /// - Parse Integer
1189 #[inline(always)]
1190 pub const fn base_suffix(&self) -> u8 {
1191 Self::BASE_SUFFIX
1192 }
1193
1194 /// Get if the format has a base suffix.
1195 #[inline(always)]
1196 pub const fn has_base_suffix(&self) -> bool {
1197 self.base_suffix() != 0
1198 }
1199
1200 // RADIX
1201
1202 /// The radix for the significant digits in the packed struct.
1203 ///
1204 /// See [`mantissa_radix`][Self::mantissa_radix].
1205 pub const MANTISSA_RADIX: u32 = flags::mantissa_radix(FORMAT);
1206
1207 /// Get the radix for mantissa digits.
1208 ///
1209 /// This is only used for the significant digits, that is, the integral and
1210 /// fractional components. Can only be modified with
1211 /// [`feature`][crate#features] `power-of-two` or `radix`. Defaults
1212 /// to `10`.
1213 ///
1214 /// | Radix | String | Number |
1215 /// |:-:|:-:|:-:|
1216 /// | 2 | "10011010010" | 1234 |
1217 /// | 3 | "1200201" | 1234 |
1218 /// | 8 | "2322" | 1234 |
1219 /// | 10 | "1234" | 1234 |
1220 /// | 16 | "4d2" | 1234 |
1221 /// | 31 | "18p" | 1234 |
1222 ///
1223 /// # Used For
1224 ///
1225 /// - Parse Float
1226 /// - Parse Integer
1227 /// - Write Float
1228 /// - Write Integer
1229 #[inline(always)]
1230 pub const fn mantissa_radix(&self) -> u32 {
1231 Self::MANTISSA_RADIX
1232 }
1233
1234 /// The radix for the significant digits in the packed struct.
1235 ///
1236 /// Alias for [`MANTISSA_RADIX`][Self::MANTISSA_RADIX].
1237 pub const RADIX: u32 = Self::MANTISSA_RADIX;
1238
1239 /// Get the radix for the significant digits.
1240 ///
1241 /// This is an alias for [`mantissa_radix`][Self::mantissa_radix].
1242 #[inline(always)]
1243 pub const fn radix(&self) -> u32 {
1244 Self::RADIX
1245 }
1246
1247 /// Get the `radix^2` for the significant digits.
1248 #[inline(always)]
1249 pub const fn radix2(&self) -> u32 {
1250 self.radix().wrapping_mul(self.radix())
1251 }
1252
1253 /// Get the `radix^4` for the significant digits.
1254 #[inline(always)]
1255 pub const fn radix4(&self) -> u32 {
1256 self.radix2().wrapping_mul(self.radix2())
1257 }
1258
1259 /// Get the `radix^8` for the significant digits.
1260 #[inline(always)]
1261 pub const fn radix8(&self) -> u32 {
1262 // NOTE: radix >= 16 will overflow here but this has no security concerns
1263 self.radix4().wrapping_mul(self.radix4())
1264 }
1265
1266 /// The base for the exponent.
1267 ///
1268 /// See [`exponent_base`][Self::exponent_base].
1269 pub const EXPONENT_BASE: u32 = flags::exponent_base(FORMAT);
1270
1271 /// Get the radix for the exponent.
1272 ///
1273 /// For example, in `1.234e3`, it means `1.234 * 10^3`, and the exponent
1274 /// base here is 10. Some programming languages, like C, support hex floats
1275 /// with an exponent base of 2, for example `0x1.8p3`, or `1.5 * 2^3`.
1276 /// Defaults to `10`. Can only be modified with [`feature`][crate#features]
1277 /// `power-of-two` or `radix`. Defaults to `10`.
1278 ///
1279 /// # Used For
1280 ///
1281 /// - Parse Float
1282 /// - Parse Integer
1283 #[inline(always)]
1284 pub const fn exponent_base(&self) -> u32 {
1285 Self::EXPONENT_BASE
1286 }
1287
1288 /// The radix for the exponent digits.
1289 ///
1290 /// See [`exponent_radix`][Self::exponent_radix].
1291 pub const EXPONENT_RADIX: u32 = flags::exponent_radix(FORMAT);
1292
1293 /// Get the radix for exponent digits.
1294 ///
1295 /// This is only used for the exponent digits. We assume the radix for the
1296 /// significant digits ([`mantissa_radix`][Self::mantissa_radix]) is
1297 /// 10 as is the exponent base. Defaults to `10`. Can only be modified with
1298 /// [`feature`][crate#features] `power-of-two` or `radix`. Defaults to `10`.
1299 ///
1300 /// | Radix | String | Number |
1301 /// |:-:|:-:|:-:|
1302 /// | 2 | "1.234^1100" | 1.234e9 |
1303 /// | 3 | "1.234^110" | 1.234e9 |
1304 /// | 8 | "1.234^14" | 1.234e9 |
1305 /// | 10 | "1.234^12" | 1.234e9 |
1306 /// | 16 | "1.234^c" | 1.234e9 |
1307 /// | 31 | "1.234^c" | 1.234e9 |
1308 ///
1309 /// # Used For
1310 ///
1311 /// - Parse Float
1312 /// - Parse Integer
1313 #[inline(always)]
1314 pub const fn exponent_radix(&self) -> u32 {
1315 Self::EXPONENT_RADIX
1316 }
1317
1318 // FLAGS
1319
1320 /// Get the flags from the number format.
1321 ///
1322 /// This contains all the non-character and non-radix values
1323 /// in the packed struct.
1324 #[inline(always)]
1325 pub const fn flags(&self) -> u128 {
1326 FORMAT & flags::FLAG_MASK
1327 }
1328
1329 /// Get the interface flags from the number format.
1330 ///
1331 /// This contains all the flags that dictate code flows, and
1332 /// therefore excludes logic like case-sensitive characters.
1333 #[inline(always)]
1334 pub const fn interface_flags(&self) -> u128 {
1335 FORMAT & flags::INTERFACE_FLAG_MASK
1336 }
1337
1338 /// Get the digit separator flags from the number format.
1339 #[inline(always)]
1340 pub const fn digit_separator_flags(&self) -> u128 {
1341 FORMAT & flags::DIGIT_SEPARATOR_FLAG_MASK
1342 }
1343
1344 /// Get the exponent flags from the number format.
1345 ///
1346 /// This contains all the flags pertaining to exponent
1347 /// formats, including digit separators.
1348 #[inline(always)]
1349 pub const fn exponent_flags(&self) -> u128 {
1350 FORMAT & flags::EXPONENT_FLAG_MASK
1351 }
1352
1353 /// Get the integer digit separator flags from the number format.
1354 #[inline(always)]
1355 pub const fn integer_digit_separator_flags(&self) -> u128 {
1356 FORMAT & flags::INTEGER_DIGIT_SEPARATOR_FLAG_MASK
1357 }
1358
1359 /// Get the fraction digit separator flags from the number format.
1360 #[inline(always)]
1361 pub const fn fraction_digit_separator_flags(&self) -> u128 {
1362 FORMAT & flags::FRACTION_DIGIT_SEPARATOR_FLAG_MASK
1363 }
1364
1365 /// Get the exponent digit separator flags from the number format.
1366 #[inline(always)]
1367 pub const fn exponent_digit_separator_flags(&self) -> u128 {
1368 FORMAT & flags::EXPONENT_DIGIT_SEPARATOR_FLAG_MASK
1369 }
1370
1371 // BUILDER
1372
1373 /// Get [`NumberFormatBuilder`] as a static function.
1374 #[inline(always)]
1375 pub const fn builder() -> NumberFormatBuilder {
1376 NumberFormatBuilder::new()
1377 }
1378
1379 /// Create [`NumberFormatBuilder`] using existing values.
1380 #[inline(always)]
1381 pub const fn rebuild() -> NumberFormatBuilder {
1382 NumberFormatBuilder::rebuild(FORMAT)
1383 }
1384}
1385
1386impl<const FORMAT: u128> Default for NumberFormat<FORMAT> {
1387 fn default() -> Self {
1388 Self::new()
1389 }
1390}
1391
1392/// Get if the radix is valid.
1393#[inline(always)]
1394pub(crate) const fn radix_error_impl(format: u128) -> Error {
1395 if !flags::is_valid_radix(flags::mantissa_radix(format)) {
1396 Error::InvalidMantissaRadix
1397 } else if !flags::is_valid_radix(flags::exponent_base(format)) {
1398 Error::InvalidExponentBase
1399 } else if !flags::is_valid_radix(flags::exponent_radix(format)) {
1400 Error::InvalidExponentRadix
1401 } else {
1402 Error::Success
1403 }
1404}
1405
1406/// Get the error type from the format.
1407#[inline(always)]
1408#[allow(clippy::if_same_then_else)] // reason="all are different logic conditions"
1409pub(crate) const fn format_error_impl(format: u128) -> Error {
1410 if !flags::is_valid_radix(flags::mantissa_radix(format)) {
1411 Error::InvalidMantissaRadix
1412 } else if !flags::is_valid_radix(flags::exponent_base(format)) {
1413 Error::InvalidExponentBase
1414 } else if !flags::is_valid_radix(flags::exponent_radix(format)) {
1415 Error::InvalidExponentRadix
1416 } else if !flags::is_valid_digit_separator(format) {
1417 Error::InvalidDigitSeparator
1418 } else if !flags::is_valid_base_prefix(format) {
1419 Error::InvalidBasePrefix
1420 } else if !flags::is_valid_base_suffix(format) {
1421 Error::InvalidBaseSuffix
1422 } else if !flags::is_valid_punctuation(format) {
1423 Error::InvalidPunctuation
1424 } else if !flags::is_valid_exponent_flags(format) {
1425 Error::InvalidExponentFlags
1426 } else if from_flag!(format, NO_POSITIVE_MANTISSA_SIGN)
1427 && from_flag!(format, REQUIRED_MANTISSA_SIGN)
1428 {
1429 Error::InvalidMantissaSign
1430 } else if from_flag!(format, NO_POSITIVE_EXPONENT_SIGN)
1431 && from_flag!(format, REQUIRED_EXPONENT_SIGN)
1432 {
1433 Error::InvalidExponentSign
1434 } else if from_flag!(format, NO_SPECIAL) && from_flag!(format, CASE_SENSITIVE_SPECIAL) {
1435 Error::InvalidSpecial
1436 } else if from_flag!(format, NO_SPECIAL) && from_flag!(format, SPECIAL_DIGIT_SEPARATOR) {
1437 Error::InvalidSpecial
1438 } else if (format & flags::INTEGER_DIGIT_SEPARATOR_FLAG_MASK)
1439 == flags::INTEGER_CONSECUTIVE_DIGIT_SEPARATOR
1440 {
1441 Error::InvalidConsecutiveIntegerDigitSeparator
1442 } else if (format & flags::FRACTION_DIGIT_SEPARATOR_FLAG_MASK)
1443 == flags::FRACTION_CONSECUTIVE_DIGIT_SEPARATOR
1444 {
1445 Error::InvalidConsecutiveFractionDigitSeparator
1446 } else if (format & flags::EXPONENT_DIGIT_SEPARATOR_FLAG_MASK)
1447 == flags::EXPONENT_CONSECUTIVE_DIGIT_SEPARATOR
1448 {
1449 Error::InvalidConsecutiveExponentDigitSeparator
1450 } else {
1451 Error::Success
1452 }
1453}