Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does a pasted number still fail conversion?

Our JavaScript Number tests turn 1 + U+200B + 2 into 12 after cleaning, but retain an internal non-breaking space and its NaN result. Cleanup does not validate a numeric format.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Hidden inside digits

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. 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
Hidden inside digits
direct string / keep / invisible true
"1​2"
U+0031 U+200B U+0032
"12"
Removed 1 invisible character
{"number":"NaN","finite":false,"empty":false}
{"number":12,"finite":true,"empty":false}
Internal NBSP
direct string / keep / invisible true
"1 234"
U+0031 U+00A0 U+0032 U+0033 U+0034
"1 234"
No selected invisible characters found
{"number":"NaN","finite":false,"empty":false}
{"number":"NaN","finite":false,"empty":false}
Edge NBSP
direct string / keep / invisible true
" 12 "
U+00A0 U+0031 U+0032 U+00A0
" 12 "
No selected invisible characters found
{"number":12,"finite":true,"empty":false}
{"number":12,"finite":true,"empty":false}
Only selected marker
direct string / keep / invisible true
"​"
U+200B
""
Removed 1 invisible character
{"number":"NaN","finite":false,"empty":false}
{"number":0,"finite":true,"empty":true}

Four numeric outcomes

The hidden-inside-digits input is not numeric before cleaning and converts to 12 afterward. The internal NBSP case stays unchanged and remains NaN. The edge-NBSP case already converts to 12 even though the characters are retained. The marker-only input becomes an empty string; Number then yields zero. That last result is a conversion rule, not evidence that the user entered zero. The table separates empty input from a finite numeric output so a downstream form can reject the empty case.

What the conversion stage establishes

We invoke Number on both exact strings, rather than claiming that an Excel, SQL or accounting importer behaves the same way. JavaScript conversion accepts whitespace at the edges but does not interpret every internal separator as a grouping symbol. The cleaner removes its selected five characters without considering digit boundaries. In our first case that joins digits, changing the accepted value. No currency symbols, decimal commas, exponent limits or localized grouping rules were tested. All fixtures are authored examples, not extracted Claude output.

Validate before accepting a value

Decide which numeric grammar the destination expects and whether empty input is allowed. Preserve the original field, inspect the specific code point and obtain the intended number before editing. Run the destination validator after a targeted repair and reject an empty field explicitly. A removal count is insufficient to establish a financial amount, a valid range or a safe integer. The homepage does not parse localized numbers or apply business rules; this experiment only explains the recorded JavaScript conversions.

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 string operations 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.