docs: def numeric_float(columns, nums_int, name=None):
      """
      Creates the grammar for a Numeric (N) field, accepting only the specified
      number of characters.
  
      This version only allows floats.
  
      As nothing in the string itself indicates how many of the characters are
      for the integer and the decimal sections, this should be specified with
      the nums_int parameter.
  
      This will indicate the number of characters, starting from the left, to be
      used for the integer value. All the remaining ones will be used for the
      decimal value.
  
      :param columns: number of columns for this field
      :param name: name for the field
      :param nums_int: characters, counting from the left, for the integer value
      :return: grammar for the float numeric field
      """
  
      if name is None:
          name = 'Numeric Field'
  
      if columns <= 0:
          # Can't be empty or have negative size
          raise BaseException('Number of columns should be positive')
  
      if nums_int < 0:
          # Integer columns can't have negative size
          raise BaseException('Number of integer values should be positive or '
                              'zero')
  
      if columns < nums_int:
          # There are more integer numbers than columns
          message = 'The number of columns is %s and should be higher or ' \
                    'equal than the integers: %s' % (
                        columns, nums_int)
          raise BaseException(message)
  
      # Basic field
      field = pp.Word(pp.nums, exact=columns)
  
      # Parse action
      field.setParseAction(lambda n: _to_numeric_float(n[0], nums_int))
  
      # Compulsory field validation action
      field.addParseAction(lambda s: _check_above_value_float(s[0], 0))
  
      # Name
      field.setName(name)
  
      return field