toWords method

String toWords()

Converts this integer (0–999,999,999) to its English word representation.

42.toWords()      // 'forty-two'
1001.toWords()    // 'one thousand one'

Implementation

String toWords() {
  final n = toInt();
  if (n < 0) return 'negative ${(-n).toWords()}';
  if (n == 0) return 'zero';
  const ones = [
    '',
    'one',
    'two',
    'three',
    'four',
    'five',
    'six',
    'seven',
    'eight',
    'nine',
    'ten',
    'eleven',
    'twelve',
    'thirteen',
    'fourteen',
    'fifteen',
    'sixteen',
    'seventeen',
    'eighteen',
    'nineteen',
  ];
  const tens = [
    '',
    '',
    'twenty',
    'thirty',
    'forty',
    'fifty',
    'sixty',
    'seventy',
    'eighty',
    'ninety',
  ];
  String helper(int num) {
    if (num == 0) return '';
    if (num < 20) return ones[num];
    if (num < 100) {
      final t = tens[num ~/ 10];
      final o = ones[num % 10];
      return o.isEmpty ? t : '$t-$o';
    }
    final rest = helper(num % 100);
    return rest.isEmpty
        ? '${ones[num ~/ 100]} hundred'
        : '${ones[num ~/ 100]} hundred $rest';
  }

  final parts = <String>[];
  if (n >= 1000000000) parts.add('${helper(n ~/ 1000000000)} billion');
  if ((n ~/ 1000000) % 1000 != 0) {
    parts.add('${helper((n ~/ 1000000) % 1000)} million');
  }
  if ((n ~/ 1000) % 1000 != 0) {
    parts.add('${helper((n ~/ 1000) % 1000)} thousand');
  }
  if (n % 1000 != 0) parts.add(helper(n % 1000));
  return parts.join(' ');
}