{"record":{"id":"bf91a2dc9870afb3","repo":"kestra-io/kestra","slug":"number-filter-can-only-be-applied-to-string-act","errorCode":null,"errorMessage":"'number' filter can only be applied to String. Actual type was: {}","messagePattern":"'number' filter can only be applied to String\\. Actual type was: (.+?)","errorType":"validation","errorClass":"PebbleException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/io/kestra/core/runners/pebble/filters/NumberFilter.java","lineNumber":26,"sourceCode":"import io.pebbletemplates.pebble.error.PebbleException;\nimport io.pebbletemplates.pebble.extension.Filter;\nimport io.pebbletemplates.pebble.template.EvaluationContext;\nimport io.pebbletemplates.pebble.template.PebbleTemplate;\n\npublic class NumberFilter implements Filter {\n    @Override\n    public List<String> getArgumentNames() {\n        return List.of(\"type\");\n    }\n\n    @Override\n    public Object apply(Object input, Map<String, Object> args, PebbleTemplate self, EvaluationContext context, int lineNumber) throws PebbleException {\n        if (input == null) {\n            return null;\n        }\n\n        if (!(input instanceof String)) {\n            throw new PebbleException(null, \"'number' filter can only be applied to String. Actual type was: \" + input.getClass().getName(), lineNumber, self.getName());\n        }\n\n        String type = (String) args.getOrDefault(\"type\", \"\");\n        String val = (String) input;\n\n        switch (type) {\n            case \"INT\":\n                return NumberUtils.createInteger(val);\n            case \"FLOAT\":\n                return NumberUtils.createFloat(val);\n            case \"LONG\":\n                return NumberUtils.createLong(val);\n            case \"DOUBLE\":\n                return NumberUtils.createDouble(val);\n            case \"BIGDECIMAL\":\n                return NumberUtils.createBigDecimal(val);\n            case \"BIGINTEGER\":\n                return NumberUtils.createBigInteger(val);","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/kestra-io/kestra/blob/823fada9274c4f9c251ea0a516460a4f7d958032/core/src/main/java/io/kestra/core/runners/pebble/filters/NumberFilter.java#L8-L44","documentation":"Thrown by the 'number' Pebble filter when the input is not a String. The filter delegates to Apache Commons `NumberUtils.createXxx` which only accepts String inputs, so any other type is rejected up front with the actual class name in the message.","triggerScenarios":"Calling `{{ someInt | number }}` where `someInt` is already a numeric type (Integer, Long, Double); passing a Boolean; passing a parsed JSON number that Jackson already converted to a numeric type.","commonSituations":"Double conversion: a value is already numeric but the flow assumes it is a string; consuming a task output whose declared type is `INTEGER` and then applying `| number` redundantly.","solutions":["Drop the `| number` filter if the value is already numeric.","Stringify first if you really need to re-parse: `{{ myval | toString | number(type=\"INT\") }}`.","Check the upstream task output type declaration and align the filter chain."],"exampleFix":"# before\n{{ outputs.fetch.value | number(type=\"INT\") }}\n# after - value is already an integer\n{{ outputs.fetch.value }}","handlingStrategy":"type-guard","validationCode":"# Only stringify-and-parse when the value is not already numeric:\n{% if myval is number %}\n  {{ myval }}\n{% else %}\n  {{ myval | toString | number(type=\"INT\") }}\n{% endif %}","typeGuard":"# Pebble: `is number` narrows numeric types away from the string-only filter.","tryCatchPattern":null,"preventionTips":["Check the upstream output type before applying `| number`.","Avoid redundant conversions; if the value is already numeric, drop the filter.","Use `toString` explicitly when you must re-parse a non-string."],"tags":["pebble-filter","number","type-mismatch","string"],"backgroundTag":null,"analyzedSha":"823fada9274c4f9c251ea0a516460a4f7d958032","analyzedAt":"2026-08-14T06:15:17.947Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}