diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/number.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/number.py new file mode 100644 index 0000000000000..afed916b61aa5 --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/number.py @@ -0,0 +1,7 @@ +.1 +1. +1E+1 +1E-1 +1.E+1 +1.0E+1 +1.1E+1 diff --git a/crates/ruff_python_formatter/src/expression/number.rs b/crates/ruff_python_formatter/src/expression/number.rs index 130640f48ff1a..7583bfd5cf0a2 100644 --- a/crates/ruff_python_formatter/src/expression/number.rs +++ b/crates/ruff_python_formatter/src/expression/number.rs @@ -142,7 +142,7 @@ fn normalize_floating_number(input: &str) -> Cow { let mut chars = input.char_indices(); - let fraction_ends_with_dot = if let Some((index, '.')) = chars.next() { + let mut prev_char_is_dot = if let Some((index, '.')) = chars.next() { // Add a leading `0` if `input` starts with `.`. output.push('0'); output.push('.'); @@ -155,8 +155,8 @@ fn normalize_floating_number(input: &str) -> Cow { loop { match chars.next() { Some((index, c @ ('e' | 'E'))) => { - if fraction_ends_with_dot { - // Add `0` if fraction part ends with `.`. + if prev_char_is_dot { + // Add `0` if the `e` immediately follows a `.` (e.g., `1.e1`). output.push_str(&input[last_index..index]); output.push('0'); last_index = index; @@ -177,9 +177,12 @@ fn normalize_floating_number(input: &str) -> Cow { break; } - Some(_) => continue, + Some((_index, c)) => { + prev_char_is_dot = c == '.'; + continue; + } None => { - if input.ends_with('.') { + if prev_char_is_dot { // Add `0` if fraction part ends with `.`. output.push_str(&input[last_index..]); output.push('0'); diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__number.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__number.py.snap new file mode 100644 index 0000000000000..feea8103e080f --- /dev/null +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__number.py.snap @@ -0,0 +1,28 @@ +--- +source: crates/ruff_python_formatter/tests/fixtures.rs +input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/number.py +--- +## Input +```py +.1 +1. +1E+1 +1E-1 +1.E+1 +1.0E+1 +1.1E+1 +``` + +## Output +```py +0.1 +1.0 +1e1 +1e-1 +1.0e1 +1.0e1 +1.1e1 +``` + + +