How do I test that a text field in $form_state has been populated by the user? At the moment I am using the following code.

if (!empty($form_state['values']['my-field']) {
  // ...
}


If the user has entered 0 (a valid input in my case) my test will return FALSE. My guess is that I need to test for an empty string '', but I'm not sure.
This depends on the field in question and what values could possibly be entered into it.

In most cases an empty string would mean that the field has had no value set. 
If zero is a valid value then check like this:

if ($form_state['values']['my-field'] !== '')


That will check that the value is an empty string, whereas != '' would also match zero and false etc.

Also, depending on your set-up and requirements, if the field has a default value you have to decide what happens in the case the the value in form state equals the default value, because in that case you don't know if the user has left the field default on purpose or not.