diff --git a/src/helpers/jsonataFunctions/transform.ts b/src/helpers/jsonataFunctions/transform.ts index 0cd382d..fce23ae 100644 --- a/src/helpers/jsonataFunctions/transform.ts +++ b/src/helpers/jsonataFunctions/transform.ts @@ -93,7 +93,6 @@ export const transform = async (input, expression: string, extraBindings: Record bindings.parseCsv = parseCsv; bindings.v2parse = v2.v2parse; bindings.v2json = v2.v2json; - bindings.isNumeric = stringFuncs.isNumeric; bindings.capabilities = fhirFuncs.capabilities; const { aliases } = getCache(); @@ -128,6 +127,7 @@ export const transform = async (input, expression: string, extraBindings: Record expr.registerFunction('base64decode', stringFuncs.base64decode, ''); expr.registerFunction('startsWith', stringFuncs.startsWith, ''); expr.registerFunction('endsWith', stringFuncs.endsWith, ''); + expr.registerFunction('isNumeric', stringFuncs.isNumeric, ''); const res = await expr.evaluate(input, bindings); return res; diff --git a/src/helpers/stringFunctions/stringFunctions.ts b/src/helpers/stringFunctions/stringFunctions.ts index 7e0677b..fa6331d 100644 --- a/src/helpers/stringFunctions/stringFunctions.ts +++ b/src/helpers/stringFunctions/stringFunctions.ts @@ -77,15 +77,18 @@ export const matches = (str: string, regex: string) => { return fn.test(str); }; -export const isNumeric = (n: any) => { - if (typeof n === 'number') { - return true; - }; - if (typeof n === 'string') { - return !isNaN(parseFloat(n)) && isFinite(parseFloat(n)); - }; +export const isNumeric = (n: any): boolean | undefined => { + if (typeof n === 'number') return true; + if (typeof n === 'undefined') return undefined; + + // RegEx taken form the FHIR spec for the decimal datatype: https://www.hl7.org/fhir/r4/datatypes.html + const isStrNumeric = (str: string) => /^-?(0|[1-9][0-9]*)(.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(str); + + if (typeof n === 'string') return isStrNumeric(n); + if (Array.isArray(n) && n.length === 1) { return isNumeric(n[0]); }; + return false; };