Skip to content

Commit 9be711e

Browse files
authored
Fix scientific floats with uppercase E (#779)
1 parent 3597351 commit 9be711e

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

src/input/parse_json.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ impl<'de> Deserialize<'de> for JsonInput {
146146

147147
if let JsonInput::String(s) = &first_value {
148148
// Normalize the string to either an int or float
149-
let normalized = if s.contains('.') || s.contains('e') {
149+
let normalized = if s.chars().any(|c| c == '.' || c == 'E' || c == 'e') {
150150
JsonInput::Float(
151151
s.parse()
152152
.map_err(|e| V::Error::custom(format!("expected a float: {e}")))?,

tests/validators/test_float.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,35 @@ def test_non_finite_constrained_float_values(input_value, allow_inf_nan, expecte
327327
assert v.validate_python(input_value) == expected
328328

329329

330-
def test_validate_scientific_notation_from_json():
330+
@pytest.mark.parametrize(
331+
'input_value,expected',
332+
[
333+
# lower e, minus
334+
('1.0e-12', 1e-12),
335+
('1e-12', 1e-12),
336+
('12e-1', 12e-1),
337+
# upper E, minus
338+
('1.0E-12', 1e-12),
339+
('1E-12', 1e-12),
340+
('12E-1', 12e-1),
341+
# lower E, plus
342+
('1.0e+12', 1e12),
343+
('1e+12', 1e12),
344+
('12e+1', 12e1),
345+
# upper E, plus
346+
('1.0E+12', 1e12),
347+
('1E+12', 1e12),
348+
('12E+1', 12e1),
349+
# lower E, unsigned
350+
('1.0e12', 1e12),
351+
('1e12', 1e12),
352+
('12e1', 12e1),
353+
# upper E, unsigned
354+
('1.0E12', 1e12),
355+
('1E12', 1e12),
356+
('12E1', 12e1),
357+
],
358+
)
359+
def test_validate_scientific_notation_from_json(input_value, expected):
331360
v = SchemaValidator({'type': 'float'})
332-
assert v.validate_json('1.0e-12') == 1e-12
333-
assert v.validate_json('1e-12') == 1e-12
361+
assert v.validate_json(input_value) == expected

0 commit comments

Comments
 (0)