- if self.digits.contains('.') {
- let mut parts = self.digits.split('.');
- let int_part_hint = parts
- .next()
- .expect("split always returns at least one element")
- .chars()
- .rev()
- .filter(|&c| c != '_')
- .collect::<Vec<_>>()
- .chunks(group_size)
- .map(|chunk| chunk.iter().rev().collect())
- .rev()
- .collect::<Vec<String>>()
- .join("_");
- let frac_part_hint = parts
- .next()
- .expect("already checked that there is a `.`")
- .chars()
- .filter(|&c| c != '_')
- .collect::<Vec<_>>()
- .chunks(group_size)
- .map(|chunk| chunk.iter().collect())
- .collect::<Vec<String>>()
- .join("_");
- let suffix_hint = match self.suffix {
- Some(suffix) if is_mistyped_float_suffix(suffix) => format!("_f{}", &suffix[1..]),
- Some(suffix) => suffix.to_string(),
- None => String::new(),
- };
- format!("{}.{}{}", int_part_hint, frac_part_hint, suffix_hint)
- } else if self.float && (self.digits.contains('E') || self.digits.contains('e')) {
- let which_e = if self.digits.contains('E') { 'E' } else { 'e' };
- let parts: Vec<&str> = self.digits.split(which_e).collect();
- let filtered_digits_vec_0 = parts[0].chars().filter(|&c| c != '_').rev().collect::<Vec<_>>();
- let filtered_digits_vec_1 = parts[1].chars().filter(|&c| c != '_').rev().collect::<Vec<_>>();
- let before_e_hint = filtered_digits_vec_0
- .chunks(group_size)
- .map(|chunk| chunk.iter().rev().collect())
- .rev()
- .collect::<Vec<String>>()
- .join("_");
- let after_e_hint = filtered_digits_vec_1
- .chunks(group_size)
- .map(|chunk| chunk.iter().rev().collect())
- .rev()
- .collect::<Vec<String>>()
- .join("_");
- let suffix_hint = match self.suffix {
- Some(suffix) if is_mistyped_float_suffix(suffix) => format!("_f{}", &suffix[1..]),
- Some(suffix) => suffix.to_string(),
- None => String::new(),
- };
- format!(
- "{}{}{}{}{}",
- self.prefix.unwrap_or(""),
- before_e_hint,
- which_e,
- after_e_hint,
- suffix_hint
- )
+
+ Self::group_digits(
+ &mut output,
+ self.integer,
+ group_size,
+ true,
+ self.radix == Radix::Hexadecimal,
+ );
+
+ if let Some(fraction) = self.fraction {
+ output.push('.');
+ Self::group_digits(&mut output, fraction, group_size, false, false);
+ }
+
+ if let Some((separator, exponent)) = self.exponent {
+ output.push(separator);
+ Self::group_digits(&mut output, exponent, group_size, true, false);
+ }
+
+ if let Some(suffix) = self.suffix {
+ output.push('_');
+ output.push_str(suffix);
+ }
+
+ output
+ }
+
+ fn group_digits(output: &mut String, input: &str, group_size: usize, partial_group_first: bool, pad: bool) {
+ debug_assert!(group_size > 0);
+
+ let mut digits = input.chars().filter(|&c| c != '_');
+
+ let first_group_size;
+
+ if partial_group_first {
+ first_group_size = (digits.clone().count() - 1) % group_size + 1;
+ if pad {
+ for _ in 0..group_size - first_group_size {
+ output.push('0');
+ }
+ }