Sha256: 1dcc003c90e45509ed619838e01e0902e7a0b6b93cb657f5119479123e120722

Contents?: true

Size: 1.6 KB

Versions: 185

Compression:

Stored size: 1.6 KB

Contents

const smallNumbers = {
  0: 'zero',
  1: 'one',
  2: 'two',
  3: 'three',
  4: 'four',
  5: 'five',
  6: 'six',
  7: 'seven',
  8: 'eight',
  9: 'nine',
  10: 'ten',
  11: 'eleven',
  12: 'twelve',
  13: 'thirteen',
  14: 'fourteen',
  15: 'fifteen',
  16: 'sixteen',
  17: 'seventeen',
  18: 'eighteen',
  19: 'nineteen',
};

const decades = {
  20: 'twenty',
  30: 'thirty',
  40: 'forty',
  50: 'fifty',
  60: 'sixty',
  70: 'seventy',
  80: 'eighty',
  90: 'ninety',
};

const bigNumbers = {
  1000: 'thousand',
  1000000: 'million',
  1000000000: 'billion',
};

function bigPart(number) {
  let factor,
    result = '';
  for (let bigNumber = 1000000000; bigNumber >= 1000; bigNumber /= 1000) {
    if (number.current >= bigNumber) {
      factor = Math.floor(number.current / bigNumber);
      result += `${threeDigit(factor)} ${bigNumbers[bigNumber]} `;
      number.current -= factor * bigNumber;
    }
  }
  return result;
}

const sayDecade = (n) => {
  for (let decade = 90; decade >= 20; decade -= 10) {
    if (n >= decade) {
      return `${decades[decade]}-${smallNumbers[n - decade]}`;
    }
  }
};

const twoDigit = n => n < 20 ? smallNumbers[n] : sayDecade(n);

const threeDigit = n => n < 100 ? twoDigit(n)
  : `${smallNumbers[Math.floor(n / 100)]} hundred ${twoDigit(n % 100)}`;

export default class Say {
  inEnglish(n) {
    let result;
    const number = { current: n };

    if (n >= 0 && n < 1000000000000) {
      result = bigPart(number);
      result += threeDigit(number.current);
      return result.replace(/.zero/, '');
    }
    throw new Error('Number must be between 0 and 999,999,999,999.');
  }
}

Version data entries

185 entries across 185 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.179 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.178 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.177 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.176 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.175 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.174 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.173 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.172 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.171 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.170 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.169 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.167 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.166 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.165 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.164 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.163 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.162 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.161 tracks/ecmascript/exercises/say/example.js
trackler-2.2.1.160 tracks/ecmascript/exercises/say/example.js