n8n-io/n8n · error · ExpressionExtensionError
cannot convert to number
Error message
cannot convert to number
What it means
toNumber() ran the strict Number() conversion on the currency-stripped string and got NaN. Unlike toFloat()/toInt(), Number() accepts no trailing garbage, so strings like '12abc' fail here even when parseFloat-based converters would succeed.
Solutions
- Ensure the string is a clean numeric literal with no trailing characters
- Use toFloat() when the value may contain trailing non-numeric characters
- Pre-validate with a numeric regex or isNumeric-style check before calling toNumber()
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at packages/@n8n/expression-runtime/src/extensions/string-extensions.ts:260 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/a4ae947c114e5b56.
Report an issue: GitHub.
Appendix: source
Thrown at packages/@n8n/expression-runtime/src/extensions/string-extensions.ts:260
function toFloat(value: string) {
if (value.includes(',')) {
throw new ExpressionExtensionError('cannot convert to float, expected . as decimal separator');
}
const float = parseFloat(value.replace(CURRENCY_REGEXP, ''));
if (isNaN(float)) {
throw new ExpressionExtensionError('cannot convert to float');
}
return float;
}
function toNumber(value: string) {
const num = Number(value.replace(CURRENCY_REGEXP, ''));
if (isNaN(num)) {
throw new ExpressionExtensionError('cannot convert to number');
}
return num;
}
function quote(value: string, extraArgs: string[]) {
const [quoteChar = '"'] = extraArgs;
return `${quoteChar}${value
.replace(/\\/g, '\\\\')
.replace(new RegExp(`\\${quoteChar}`, 'g'), `\\${quoteChar}`)}${quoteChar}`;
}
function isNumeric(value: string) {
if (value.includes(' ')) return false;
return !isNaN(value as unknown as number) && !isNaN(parseFloat(value));
}
View on GitHub (pinned to 5ac6606e81)