docs: def make_number(num: str, repr_: str = None, speak: str = None):
      """
      Returns a Number or Fraction dataclass for a number string
      """
      if not num or is_unknown(num):
          return
      # Check CAVOK
      if num == 'CAVOK':
          return Number('CAVOK', 9999, 'ceiling and visibility ok')  # type: ignore
      # Check special
      if num in SPECIAL_NUMBERS:
          return Number(repr_ or num, None, SPECIAL_NUMBERS[num])  # type: ignore
      # Create Fraction
      if '/' in num:
          nmr, dnm = [int(i) for i in num.split('/')]
          unpacked = unpack_fraction(num)
          spoken = spoken_number(unpacked)
          return Fraction(repr_ or num, nmr / dnm, spoken, nmr, dnm, unpacked)  # type: ignore
      # Create Number
      val = num.replace('M', '-')
      val = float(val) if '.' in num else int(val)  # type: ignore
      return Number(repr_ or num, val, spoken_number(speak or str(val)))