Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does parseFloat return 1 for an incomplete exponent?

Our 1e+ control returns 1 from parseFloat while Number returns NaN. For 1e plus U+200B plus 3, cleanup changes parseFloat from 1 to 1000. A parsed prefix alone does not validate the complete field.

Tested October 17, 2026 · v24.19.0 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Interrupted exponent

Measured inputs and outputs

These are locally constructed test strings, not evidence that Claude inserts these characters. We executed the saved homepage script snapshot with a minimal DOM harness and compared exact strings. The invisible-checkbox state and dash mode appear in each row. The observations below test this page's specific question. Destination observations run independently on the exact input and cleaned strings in the recorded Node runtime. We make no detector-score or statistical-watermark removal claim.

Before and after observations; full code points and strings are in the JSON download.
Fixture and modeInput string and code pointsOutput and cleaner statusObserved before / after
Interrupted exponent
direct string / keep / invisible true
"1e​3"
U+0031 U+0065 U+200B U+0033
"1e3"
Removed 1 invisible character
{"parseFloatLabel":"1","numberLabel":"NaN","fullNumberFinite":false}
{"parseFloatLabel":"1000","numberLabel":"1000","fullNumberFinite":true}
Incomplete exponent
direct string / keep / invisible true
"1e+"
U+0031 U+0065 U+002B
"1e+"
No selected invisible characters found
{"parseFloatLabel":"1","numberLabel":"NaN","fullNumberFinite":false}
{"parseFloatLabel":"1","numberLabel":"NaN","fullNumberFinite":false}
Unit suffix
direct string / keep / invisible true
"12.5px"
U+0031 U+0032 U+002E U+0035 U+0070 U+0078
"12.5px"
No selected invisible characters found
{"parseFloatLabel":"12.5","numberLabel":"NaN","fullNumberFinite":false}
{"parseFloatLabel":"12.5","numberLabel":"NaN","fullNumberFinite":false}
Finite reference
direct string / keep / invisible true
"1e3"
U+0031 U+0065 U+0033
"1e3"
No selected invisible characters found
{"parseFloatLabel":"1000","numberLabel":"1000","fullNumberFinite":true}
{"parseFloatLabel":"1000","numberLabel":"1000","fullNumberFinite":true}

An interrupted exponent can yield a plausible smaller number

The authored first sample places U+200B immediately after the exponent marker in 1e3. Before cleanup parseFloat returns one, whereas Number returns NaN. After removal both operations return one thousand. A consumer looking only for a numeric parseFloat result could therefore silently accept a value three orders of magnitude smaller than the intended scientific notation in this one fixture. We do not infer the intended value of an unknown user field; the intended spelling is known because we authored this test. The record includes the exact raw and cleaned strings alongside textual numeric labels, making it possible to distinguish a selected deletion from a later conversion decision.

The incomplete and unit-bearing controls remain unchanged

The 1e+ sample contains no selected invisible character and stays the same after cleaning. Its parseFloat result is still one, and its Number result is still NaN. The 12.5px control similarly returns a decimal prefix from parseFloat but fails whole-string numeric conversion. The unmarked 1e3 reference returns one thousand through both operations. These controls show that incomplete exponents and trailing unit text do not become fully valid fields merely because the cleaner reports no findings. Our earlier integer-prefix test uses parseInt; this experiment specifically measures decimal exponent completion through parseFloat. It does not test a CSS parser, locale-specific decimals, arbitrary precision, or the full set of accepted numeric spellings.

Choose whole-field validation before consuming a number

For a field whose contract is one complete number, do not use the existence of a parseFloat result as the only acceptance condition. Check the complete spelling under the required grammar and validate the resulting type, finiteness and range as appropriate. Number is included as a measured comparison, not as a universal validator for every application; its treatment of empty strings or other numeric forms requires separate decisions. If a format intentionally allows a numeric prefix followed by a unit, parse and validate the unit too. The fixtures identify an observable truncation risk after a broken paste without recommending that all suffixes be discarded or that every invisible character be removed.

Reproduce this test

Save reproduce.cjs and tested-app.js in the same folder. Run the command below with Node.js. The harness prints its runtime, script SHA-256 and every measured row. Compare those rows with the original record. Using a newer script or runtime creates a new experiment; retain the version information with your rerun.

node reproduce.cjs

Reference and next check

ECMAScript parseFloat provides the relevant primary definition. The table and fixture analysis are original measurements. For broader inspection, use our Unicode inspector. Read the scope distinction before interpreting cleanup as a watermark result.