toWords method
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(' ');
}