HTML tags are counted in for the length of a teaser, instead of words?
Below is a very simple, but mostly complete, and un-tested text formatter with a setting for how many words to allow.

It's five different functions, that


Tell Drupal there is a new formatter.
Provide the "How many words? form.
Outputs the current setting from above in the display settings form
Limits the number of words in the current text field
Render the actual output




/*
 * Implements hook_field_formatter_info().
 */
function HOOK_field_formatter_info() {
  return array(
    'HOOK_limit_by_words' =&gt; array(
      'label' =&gt; t('Text limited by words'),
      'field types' =&gt; array('text'),
      'settings' =&gt; array('number_of_words' =&gt; 100),
    ),
  );
}

/*
 * Implements hook_field_formatter_settings_form().
 */
function HOOK_field_formatter_settings_form($field, $instance, $view_mode, $form, &amp;$form_state) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];

  $element = array(
    'HOOK_limit_by_words' =&gt; array(
      '#type' =&gt; 'textfield',
      '#title' =&gt; t('Number of words to use'),
      '#default_value' =&gt; $settings['HOOK_limit_by_words'],
    ),
  );

  return $element;
}

/*
 * Implements hook_field_formatter_settings_summary().
 */
function HOOK_field_formatter_settings_summary($field, $instance, $view_mode) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];

  return t('The current word limit is @wordlimit', array('@wordlimit' =&gt; $settings['HOOK_limit_by_words']));
}

function HOOK_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];

  $element = array(
    0 =&gt; array(
      '#markup' =&gt; word_trim($items[0]['value'], $settings['HOOK_limit_by_words']);
    ),
  );

  return $element;
}

/**
 * Trim a string to a given number of words.
 * Thanks Lullabot.
 *
 * @param string $string
 *   the original string
 * @param int $count
 *   the word count
 * @param bool $ellipsis
 *   TRUE to add "..."
 *   or use a string to define other character
 *
 * @return string
 *   trimmed string with ellipsis added if it was truncated
 */
function word_trim($string, $count, $ellipsis = FALSE) {
  $words = explode(' ', $string);
  if (count($words) &gt; $count) {
    array_splice($words, $count);
    $string = implode(' ', $words);
    if (is_string($ellipsis)) {
      $string .= $ellipsis;
    }
    elseif ($ellipsis) {
      $string .= '&amp;hellip;';
    }
  }
  return $string;
}