Bugzilla – Bug 327
Change the 'floating point number' syntax to allow an exponent.
Last modified: 2011-05-24 16:15:45 CEST
Index: source =================================================================== --- source (revision 2241) +++ source (revision 2242) @@ -1263,11 +1263,45 @@ <h5>Real numbers</h5> <p>A string is a <dfn>valid floating point number</dfn> if it - consists of one of more characters in the range U+0030 DIGIT ZERO - (0) to U+0039 DIGIT NINE (9), optionally with a single U+002E FULL - STOP (".") character somewhere (either before these numbers, in - between two numbers, or after the numbers), all optionally prefixed - with a U+002D HYPHEN-MINUS ("-") character.</p> + consists of:</p> + + <ol class="brief"> + + <li>Optionally, a U+002D HYPHEN-MINUS ("-") character.</li> + + <li>A series of one or more characters in the range U+0030 DIGIT + ZERO (0) to U+0039 DIGIT NINE (9).</li> + + <li>Optionally: + + <ol> + + <li>A single U+002E FULL STOP (".") character.</li> + + <li>A series of one or more characters in the range U+0030 DIGIT + ZERO (0) to U+0039 DIGIT NINE (9).</li> + + </ol> + + </li> + + <li>Optionally: + + <ol> + + <li>Either a U+0065 LATIN SMALL LETTER E character or a U+0045 + LATIN CAPITAL LETTER E character.</li> + + <li>Optionally, a U+002D HYPHEN-MINUS ("-") character.</li> + + <li>A series of characters in the range U+0030 DIGIT ZERO (0) to + U+0039 DIGIT NINE (9).</li> + + </ol> + + </li> + + </ol> <p>The <dfn>rules for parsing floating point number values</dfn> are as given in the following algorithm. As with the previous @@ -1286,23 +1320,26 @@ title="">input</var>, initially pointing at the start of the string.</p></li> - <li><p>Let <var title="">value</var> have the value 0.</li> + <li><p>Let <var title="">value</var> have the value 1.</li> - <li><p>Let <var title="">sign</var> have the value "positive".</li> + <li><p>Let <var title="">divisor</var> have the value 1.</p></li> + + <li><p>Let <var title="">exponent</var> have the value 1.</p></li> <li><p><span>Skip whitespace</span>.</p></li> <li><p>If <var title="">position</var> is past the end of <var - title="">input</var>, return an error.</p></li> + title="">input</var>, return an error.</p></li> <li> - <p>If the character indicated by <var title="">position</var> (the - first character) is a U+002D HYPHEN-MINUS ("-") character:</p> + <p>If the character indicated by <var title="">position</var> is a + U+002D HYPHEN-MINUS ("-") character:</p> <ol> - <li>Let <var title="">sign</var> be "negative".</li> + <li>Change <var title="">value</var> and <var + title="">divisor</var> to −1.</li> <li>Advance <var title="">position</var> to the next character.</li> @@ -1314,88 +1351,110 @@ </li> - <li><p>If the next character is not one of U+0030 DIGIT ZERO (0) - .. U+0039 DIGIT NINE (9) or U+002E FULL STOP ("."), then return an - error.</p></li> - - <li><p>If the next character is U+002E FULL STOP ("."), but either - that is the last character or the character after that one is not - one of U+0030 DIGIT ZERO (0) .. U+0039 DIGIT NINE (9), then return - an error.</p></li> + <li><p>If the character indicated by <var title="">position</var> + is not one of U+0030 DIGIT ZERO (0) .. U+0039 DIGIT NINE (9), then + return an error.</p></li> <!-- Ok. At this point we know we have a number. It might have trailing garbage which we'll ignore, but it's a number, and we won't return an error. --> - <li> + <li><p><span>Collect a sequence of characters</span> in the range + U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), and interpret the + resulting sequence as a base-ten integer. Multiply <var + title="">value</var> by that integer.</p></li> - <p>If the next character is one of U+0030 DIGIT ZERO (0) .. U+0039 - DIGIT NINE (9):</p> + <li>If <var title="">position</var> is past the end of <var + title="">input</var>, return <var title="">value</var> and abort + these steps.</li> + + <li><p>If the character indicated by <var title="">position</var> + is a U+002E FULL STOP ("."), run these substeps:</p> <ol> - <li>Multiply <var title="">value</var> by ten.</li> + <li><p>Advance <var title="">position</var> to the next + character.</p></li> - <li>Add the value of the current character (0..9) to <var - title="">value</var>.</li> + <li><p>If <var title="">position</var> is past the end of <var + title="">input</var>, or if the character indicated by <var + title="">position</var> is not one of U+0030 DIGIT ZERO (0) + .. U+0039 DIGIT NINE (9), then return <var title="">value</var> + and abort these steps.</li> + + <li><p><i>Fraction loop</i>: Multiply <var title="">divisor</var> + by ten.</p></li> + + <li>Add the value of the current character interpreted as a + base-ten digit (0..9) divided by <var title="">divisor</var>, to + <var title="">value</var>.</li> - <li>Advance <var title="">position</var> to the next - character.</li> + <li><p>Advance <var title="">position</var> to the next + character.</p></li> - <li>If <var title="">position</var> is past the end of <var - title="">input</var>, then if <var title="">sign</var> is - "positive", return <var title="">value</var>, otherwise return - 0-<var title="">value</var>.</li> + <li><p>If <var title="">position</var> is past the end of <var + title="">input</var>, then return <var title="">value</var> and + abort these steps.</li> - <li>Otherwise return to the top of step 10 in the overall - algorithm (that's the step within which these substeps find - themselves).</li> + <li><p>If the character indicated by <var title="">position</var> + is one of U+0030 DIGIT ZERO (0) .. U+0039 DIGIT NINE (9), return + to the step labeled <i>fraction loop</i> in these + substeps.</p></li> </ol> </li> - <li><p>Otherwise, if the next character is not a U+002E FULL STOP - ("."), then if <var title="">sign</var> is "positive", return <var - title="">value</var>, otherwise return 0-<var - title="">value</var>.</p></li> + <li><p>If the character indicated by <var title="">position</var> + is a U+0065 LATIN SMALL LETTER E character or a U+0045 LATIN + CAPITAL LETTER E character, run these substeps:</p> - <li><p>The next character is a U+002E FULL STOP ("."). Advance <var - title="">position</var> to the character after that.</p></li> + <ol> - <li><p>Let <var title="">divisor</var> be 1.</p></li> + <li><p>Advance <var title="">position</var> to the next + character.</p></li> - <li> + <li><p>If <var title="">position</var> is past the end of <var + title="">input</var>, then return <var title="">value</var> and + abort these steps.</li> - <p>If the next character is one of U+0030 DIGIT ZERO (0) .. U+0039 - DIGIT NINE (9):</p> + <li> - <ol> + <p>If the character indicated by <var title="">position</var> is + a U+002D HYPHEN-MINUS ("-") character:</p> - <li>Multiply <var title="">divisor</var> by ten.</li> + <ol> - <li>Add the value of the current character (0..9) divided by <var - title="">divisor</var>, to <var title="">value</var>.</li> + <li>Change <var title="">exponent</var> to −1.</li> - <li>Advance <var title="">position</var> to the next - character.</li> + <li>Advance <var title="">position</var> to the next + character.</li> - <li>If <var title="">position</var> is past the end of <var - title="">input</var>, then if <var title="">sign</var> is - "positive", return <var title="">value</var>, otherwise return - 0-<var title="">value</var>.</li> + <li><p>If <var title="">position</var> is past the end of <var + title="">input</var>, then return <var title="">value</var> and + abort these steps.</li> - <li>Otherwise return to the top of step 14 in the overall - algorithm (that's the step within which these substeps find - themselves).</li> + </ol> + + </li> + + <li><p>If the character indicated by <var title="">position</var> + is not one of U+0030 DIGIT ZERO (0) .. U+0039 DIGIT NINE (9), + then return <var title="">value</var> and abort these steps.</li> + + <li><p><span>Collect a sequence of characters</span> in the range + U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), and interpret the + resulting sequence as a base-ten integer. Multiply <var + title="">exponent</var> by that integer.</p></li> + + <li><p>Multiply <var title="">value</var> by ten raised to the + <var title="">exponent</var>th power.</p></li> </ol> </li> - <li><p>Otherwise, if <var title="">sign</var> is "positive", return - <var title="">value</var>, otherwise return 0-<var - title="">value</var>.</p></li> + <li><p>Return <var title="">value</var>.</p></li> </ol> @@ -26335,7 +26394,7 @@ should allow the user to change the URL represented by its <span title="concept-fe-value">value</span>. User agents may allow the user to set the <span title="concept-fe-value">value</span> to a - string that is not a <span>value URL</span>. User agents should + string that is not a <span>valid URL</span>. User agents should allow the user to set the <span title="concept-fe-value">value</span> to the empty string. User agents must not allow users to insert U+000A LINE FEED (LF) or @@ -26502,8 +26561,8 @@ <p><strong>Constraint validation:</strong> When there is both a <span title="concept-input-value-datetime">selected UTC date and time</span> and a <span title="concept-input-min-datetime">minimum - UTC date and time</span>, if the former is less than the latter, the - element is <span>suffering from an underflow</span>.</p> + UTC date and time</span>, if the former is earlier than the latter, + the element is <span>suffering from an underflow</span>.</p> <p>The <code title="attr-input-max">max</code> attribute, if specified, must have a value that is a <span>valid UTC date and @@ -26518,10 +26577,18 @@ <p><strong>Constraint validation:</strong> When there is both a <span title="concept-input-value-datetime">selected UTC date and time</span> and a <span title="concept-input-max-datetime">maximum - UTC date and time</span>, if the former is more than the latter, the - element is <span>suffering from an overflow</span>.</p> + UTC date and time</span>, if the former is later than the latter, + the element is <span>suffering from an overflow</span>.</p> + + <p class="big-issue">The <code title="attr-input-step">step</code> + attribute, if specified, must have a value that is a ...</p> - <p class="big-issue">... <code title="attr-input-step">step</code></p> + <!-- values: positive non-zero floating point, or "any" --> + <!-- units: seconds --> + <!-- default: 60 --> + <!-- zero point: min, or 1970-01-01T00:00:00.0Z --> + <!-- allow rounding --> + <!-- <span>suffering from a step mismatch</span> --> <p>The following common <code>input</code> element content attributes, DOM attributes, and methods apply to the element:
As a few obvious test cases: Per the current version of the spec (not just this diff), I believe the following are handled incorrectly: Positive valid floating point numbers: 1e0 1e+0 1e-0 Non-positive valid floating point numbers: 0e0 0e5 1e-40 Invalid: .1 1. . -
https://bitbucket.org/validator/syntax/changeset/9470a25d30d4 https://bitbucket.org/validator/syntax/changeset/2cf690068680