toWord method

  1. @override
String toWord(
  1. num number
)
override

Converts a given number to a spelled out version of itself.

Implementation

@override
String toWord(num number) {
  if (number == 0) return "zero";

  if (number > maxNumber) {
    throw TooLargeNumberException(number, maxNumber);
  }

  number = removeDecimalZeros(number);

  if (hasComma(number)) {
    Tuple2<num, num?> numParts = splitByComma(number);
    String partOne = toWord(numParts.item1);
    String partTwo = toWord(numParts.item2!);
    late String endPart;

    switch (partTwo.toString().length) {
      case 1:
        endPart = " tenth";
        break;
      case 2:
        endPart = " hundredth";
        break;
      case 3:
        endPart = " thousandth";
        break;
      case 4:
        endPart = addHyphens ? " ten-thousandth" : " ten thousandth";
        break;
      case 5:
        endPart = addHyphens ? " hundred-thousandth" : " hundred thousandth";
        break;
      case 6:
        endPart = " millionth";
        break;
      case 7:
        endPart = addHyphens ? " ten-millionth" : " ten millionth";
        break;
      case 8:
        endPart = addHyphens ? " hundred-millionths" : " hundred millionths";
        break;
      case 9:
        endPart = " billionth";
        break;
      case 10:
        endPart = addHyphens ? " ten-billionths" : " ten billionths";
        break;
      case 11:
        endPart = addHyphens ? " hundred-billionth" : " hundred billionth";
        break;
      case 12:
        endPart = " trillionth";
        break;
      case 13:
        endPart = addHyphens ? " ten-trillionth" : " ten trillionth";
        break;
      // case 14:
      //   endPart = addHyphens ? " hundred-trillionth" : " hundred trillionth";
      //   break;
      // case 15:
      //   endPart = " quadrillionth";
      //   break;
      // case 16:
      //   endPart = addHyphens ? " ten-quadrillionth" : " ten quadrillionth";
      //   break;
      // case 17:
      //   endPart =
      //       addHyphens ? " hundred-quadrillionth" : " hundred quadrillionth";
      //   break;
      // case 18:
      //   endPart = " quintillionth";
      //   break;
      // case 19:
      //   endPart = addHyphens ? " ten-quintillionth" : " ten quintillionth";
      //   break;
      // case 20:
      //   endPart =
      //       addHyphens ? " hundred-quintillionth" : " hundred quintillionth";
      //   break;
      // case 21:
      //   endPart = " sextillionth";
      //   break;
      // case 22:
      //   endPart = addHyphens ? " ten-sextillionth" : " ten sextillionth";
      //   break;
      // case 23:
      //   endPart =
      //       addHyphens ? " hundred-sextillionth" : " hundred sextillionth";
      //   break;
      // case 24:
      //   endPart = " septillionth";
      //   break;
      // case 25:
      //   endPart = addHyphens ? " ten-septillionth" : " ten septillionth";
      //   break;
      // case 26:
      //   endPart =
      //       addHyphens ? " hundred-septillionth" : " hundred septillionth";
      //   break;
      // case 27:
      //   endPart = " octillionth";
      //   break;
      // case 28:
      //   endPart = addHyphens ? " ten-octillionth" : " ten octillionth";
      //   break;
      // case 29:
      //   endPart =
      //       addHyphens ? " hundred-octillionth" : " hundred octillionth";
      //   break;
      // case 30:
      //   endPart = " nonillionth";
      //   break;
      // case 31:
      //   endPart = addHyphens ? " ten-nonillionth" : " ten nonillionth";
      //   break;
      // case 32:
      //   endPart =
      //       addHyphens ? " hundred-nonillionth" : " hundred nonillionth";
      //   break;
      // case 33:
      //   endPart = " decillionth";
      //   break;
      // case 34:
      //   endPart = addHyphens ? " ten-decillionth" : " ten decillionth";
      //   break;
      // case 35:
      //   endPart =
      //       addHyphens ? " hundred-decillionth" : " hundred decillionth";
      //   break;
      default:
        throw TooManyDecimalValues(
          number,
          partTwo.toString().length,
          maxDecimals,
        );
    }

    return partTwo == "one"
        ? partOne + " and " + partTwo + endPart
        : partOne + " and " + partTwo + endPart + "s";
  }

  num _number = number.abs();
  List<String> words = [];
  List<num> groups =
      format.format(_number).split(",").map((e) => num.parse(e)).toList();

  List<num> groups_ = groups.reversed.toList();

  for (int i = 0; i < groups_.length; i++) {
    words.add(i == 0 ? _thousand(groups_[i]) : _more(groups_[i], i));
  }

  String word = words.reversed.join(" ");
  return number < 0 ? "minus " + word : word;
}