diff --git a/core/modules/field/modules/number/number.module b/core/modules/field/modules/number/number.module
index 87e2d3a..0d51965 100644
--- a/core/modules/field/modules/number/number.module
+++ b/core/modules/field/modules/number/number.module
@@ -377,37 +377,26 @@ function number_field_widget_validate($element, &$form_state) {
     switch ($type) {
       case 'float':
       case 'decimal':
-        $regexp = '@[^-0-9\\' . $field['settings']['decimal_separator'] . ']@';
+        $regexp = '@^[+-]?[0-9]*(' . preg_quote($field['settings']['decimal_separator']) . '[0-9]*)?$@';
         $message = t('Only numbers and the decimal separator (@separator) allowed in %field.', array('%field' => $instance['label'], '@separator' => $field['settings']['decimal_separator']));
         break;
 
       case 'integer':
-        $regexp = '@[^-0-9]@';
+        $regexp = '@^[+-]?[0-9]*$@';
         $message = t('Only numbers are allowed in %field.', array('%field' => $instance['label']));
         break;
     }
-    if ($value != preg_replace($regexp, '', $value)) {
-      form_error($element, $message);
-    }
-    else {
+    if (preg_match($regexp, $value)) {
+      // Things should be fine.
       if ($type == 'decimal' || $type == 'float') {
-        // Verify that only one decimal separator exists in the field.
-        if (substr_count($value, $field['settings']['decimal_separator']) > 1) {
-          $message = t('%field: There should only be one decimal separator (@separator).',
-            array(
-              '%field' => t($instance['label']),
-              '@separator' => $field['settings']['decimal_separator'],
-            )
-          );
-          form_error($element, $message);
-        }
-        else {
-          // Substitute the decimal separator; things should be fine.
-          $value = strtr($value, $field['settings']['decimal_separator'], '.');
-        }
+        // Substitute the decimal separator.
+        $value = strtr($value, $field['settings']['decimal_separator'], '.');
       }
       form_set_value($element, $value, $form_state);
     }
+    else {
+      form_error($element, $message);
+    }
   }
 }
 
