mirror of
https://github.com/servo/servo.git
synced 2025-07-23 07:13:52 +01:00
account for sign in double parsing
When sign was present during double parsing correctly jump forward the extra character when parsing fraction and exponent.
This commit is contained in:
parent
3401361461
commit
f3079e8728
2 changed files with 24 additions and 6 deletions
|
@ -92,17 +92,17 @@ pub fn parse_double(string: &str) -> Result<f64, ()> {
|
||||||
let trimmed = string.trim_matches(HTML_SPACE_CHARACTERS);
|
let trimmed = string.trim_matches(HTML_SPACE_CHARACTERS);
|
||||||
let mut input = trimmed.chars().peekable();
|
let mut input = trimmed.chars().peekable();
|
||||||
|
|
||||||
let (value, divisor) = match input.peek() {
|
let (value, divisor, chars_skipped) = match input.peek() {
|
||||||
None => return Err(()),
|
None => return Err(()),
|
||||||
Some(&'-') => {
|
Some(&'-') => {
|
||||||
input.next();
|
input.next();
|
||||||
(-1f64, -1f64)
|
(-1f64, -1f64, 1)
|
||||||
}
|
}
|
||||||
Some(&'+') => {
|
Some(&'+') => {
|
||||||
input.next();
|
input.next();
|
||||||
(1f64, 1f64)
|
(1f64, 1f64, 1)
|
||||||
}
|
}
|
||||||
_ => (1f64, 1f64)
|
_ => (1f64, 1f64, 0)
|
||||||
};
|
};
|
||||||
|
|
||||||
let (value, value_digits) = if let Some(&'.') = input.peek() {
|
let (value, value_digits) = if let Some(&'.') = input.peek() {
|
||||||
|
@ -112,11 +112,11 @@ pub fn parse_double(string: &str) -> Result<f64, ()> {
|
||||||
(value * read_val.and_then(|result| result.to_f64()).unwrap_or(1f64), read_digits)
|
(value * read_val.and_then(|result| result.to_f64()).unwrap_or(1f64), read_digits)
|
||||||
};
|
};
|
||||||
|
|
||||||
let input = trimmed.chars().skip(value_digits).peekable();
|
let input = trimmed.chars().skip(value_digits + chars_skipped).peekable();
|
||||||
|
|
||||||
let (mut value, fraction_digits) = read_fraction(input, divisor, value);
|
let (mut value, fraction_digits) = read_fraction(input, divisor, value);
|
||||||
|
|
||||||
let input = trimmed.chars().skip(value_digits + fraction_digits).peekable();
|
let input = trimmed.chars().skip(value_digits + chars_skipped + fraction_digits).peekable();
|
||||||
|
|
||||||
if let Some(exp) = read_exponent(input) {
|
if let Some(exp) = read_exponent(input) {
|
||||||
value *= 10f64.powi(exp)
|
value *= 10f64.powi(exp)
|
||||||
|
|
|
@ -14,6 +14,24 @@ fn test_parse_double() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_double_negative_prefix() {
|
||||||
|
let value = String::from("-5.6");
|
||||||
|
match AttrValue::from_double(value, 0.0) {
|
||||||
|
AttrValue::Double(_, num) => assert_eq!(num, -5.6f64),
|
||||||
|
_ => panic!("expected a double value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_double_positive_prefix() {
|
||||||
|
let value = String::from("+5.6");
|
||||||
|
match AttrValue::from_double(value, 0.0) {
|
||||||
|
AttrValue::Double(_, num) => assert_eq!(num, 5.6f64),
|
||||||
|
_ => panic!("expected a double value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_from_limited_i32_should_be_default_when_less_than_0() {
|
fn test_from_limited_i32_should_be_default_when_less_than_0() {
|
||||||
let value = String::from("-1");
|
let value = String::from("-1");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue