import type { PhpRuntimeValue } from '../_helpers/_phpTypes.ts' type NumericValue = PhpRuntimeValue export function is_numeric(mixedVar: NumericValue): mixedVar is number | string { // discuss at: https://locutus.io/php/is_numeric/ // original by: Kevin van Zonneveld (https://kvz.io) // improved by: David // improved by: taith // bugfixed by: Tim de Koning // bugfixed by: WebDevHobo (https://webdevhobo.blogspot.com/) // bugfixed by: Brett Zamir (https://brett-zamir.me) // bugfixed by: Denis Chenu (https://shnoulle.net) // example 1: is_numeric(186.31) // returns 1: true // example 2: is_numeric('Kevin van Zonneveld') // returns 2: false // example 3: is_numeric(' +186.31e2') // returns 3: true // example 4: is_numeric('') // returns 4: false // example 5: is_numeric([]) // returns 5: false // example 6: is_numeric('1 ') // returns 6: false const whitespace = [ ' ', '\n', '\r', '\t', '\f', '\x0b', '\xa0', '\u2000', '\u2001', '\u2002', '\u2003', '\u2004', '\u2005', '\u2006', '\u2007', '\u2008', '\u2009', '\u200a', '\u200b', '\u2028', '\u2029', '\u3000', ].join('') // @todo: Break this up using many single conditions with early returns if (typeof mixedVar === 'number') { return !Number.isNaN(mixedVar) } if (typeof mixedVar !== 'string') { return false } return mixedVar !== '' && whitespace.indexOf(mixedVar.slice(-1)) === -1 && !Number.isNaN(Number(mixedVar)) }