Handmade JavaScript Atoi

by Erick Petrucelli

TypeScript

function atoi(str) {
	const symbols = ['-', '+'];
  const numbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9'];
  const min = -2147483648;
  const max = 2147483647;
	let r = '', s = '';
	for (let i = 0; i < str.length; i++) {
  	const c = str.charAt(i);
    if (c === ' ') {
    	if (!r) continue;
      break;
    } else if (c === '0') {
    	if (!r) continue;
      r += c;
    } else if (symbols.includes(c)) {
    	if (r || s) break;
      s = c;
    } else if (numbers.includes(c)) {
    	r += c;
    } else {
    	break;
    }
  }
  
  if (!r) return 0;
  r = Number(`${s}${r}`);
	return r < min ? min : r > max ? max : r;
}

function log(input, expected) {
	document.write(`<pre>${input}: <b>${atoi(input)}</b> <small>// ${expected}</small></pre>`);
}

log('-123', -123);
log('  -', 0);
log(' 1231231231311133', 2147483647);
log('-999999999999', -2147483648);
log('  -0012gfg4', -12);
log('325-', 325);
log('506f506', 506);