--- number.module	2007-01-25 21:16:01.000000000 +0100
+++ number.module.decimal_3	2007-01-26 11:26:00.000000000 +0100
@@ -11,8 +11,11 @@
  */
 function number_field_info() {
   return array(
-    'number_integer' => array('label' => 'Integer'),
-    'number_decimal' => array('label' => 'Decimal'),
+    'number_integer'      => array('label' => 'Integer'),
+    'number_float'        => array('label' => 'Float'),
+    'number_double'       => array('label' => 'Double'),
+    'number_decimal'      => array('label' => 'old Decimal (actually Float)'),
+    'number_decimal_10_2' => array('label' => 'Decimal(10,2)'),
   );
 }
 
@@ -52,6 +55,24 @@ function number_field_settings($op, $fie
         '#default_value' => isset($field['suffix']) ? $field['suffix'] : '',
         '#description' => t('Define a string that should suffixed to the value, like m², m/s², kb/s. Leave blank for none. Separate singular and plural values with a pipe (pound|pounds). '),
       );
+//       $form['advanced_datatype_settings'] = array(
+//         '#type' => 'fieldset',
+//         '#title' => 'Advanced datatype settings',
+//         '#collapsible' => TRUE,
+//         '#collapsed' => TRUE,
+//       );
+//       $form['advanced_datatype_settings']['db_length'] = array(
+//         '#type' => 'textfield',
+//         '#title' => 'Length',
+//         '#default_value' => isset($field['db_length']) ? $field['db_length'] : '',
+//         '#description' => 'Define the length "M,D" of the Numberic type. Depends on the selected number type [Integer(M), Float(M,D), Decimal(M,D)]. E.g. if you want to setup a monetary field, "10,2" is a good choice. This would allow you monetary values ranging from -99.999.999,99€ to 99.999.999,99€. See your database documentation for further information.',
+//       );
+//       $form['advanced_datatype_settings']['db_unsigned'] = array(
+//         '#type' => 'checkbox',
+//         '#title' => 'Unsigned',
+//         '#default_value' => isset($field['db_unsigned']) ? $field['db_unsigned'] : '',
+//         '#description' => 'If selected, disallows negative values',
+//       );
       $form['allowed_values'] = array(
         '#type' => 'textarea',
         '#title' => t('Allowed values list'),
@@ -77,25 +98,81 @@ function number_field_settings($op, $fie
 
     case 'validate':
       if ($field['min'] && !is_numeric($field['min'])) {
-        form_set_error('rows', t('"Minimum" must be a number.'));
+        form_set_error('min', t('"Minimum" must be a number.'));
       }
       if ($field['max'] && !is_numeric($field['max'])) {
-        form_set_error('rows', t('"Maximum" must be a number.'));
+        form_set_error('max', t('"Maximum" must be a number.'));
+      }
+      // validate the db_length field
+      if ($field['db_length']) {
+        $length = explode(',', $field['db_length'], 2);
+        if ( ($length[0] && !is_numeric($length[0])) || ($length[1] && !is_numeric($length[1])) ) { 
+          form_set_error('db_length', t('"Length" in "Advanced datatype settings" must be of the format "M,D", wheras M and D are numeric.'));
+        }
       }
       break;
 
     case 'save':
-      return array('prefix', 'suffix', 'append_position', 'min', 'max', 'allowed_values', 'allowed_values_php');
+      return array('prefix', 'suffix', 'append_position', 'db_length', 'db_unsigned', 'min', 'max', 'allowed_values', 'allowed_values_php');
 
     case 'database columns':
       if ($field['type'] == 'number_integer') {
         return array(
-          'value' => array('type' => 'int', 'not null' => FALSE, 'default' => NULL, 'sortable' => TRUE),
+          'value' => array(
+            'type'     => 'int',
+//             'length'   => $field['db_length'],
+//             'unsigned' => $field['db_unsigned'],
+            'not null' => FALSE,
+            'default'  => NULL,
+            'sortable' => TRUE
+          ),
+        );
+      }
+      if ($field['type'] == 'number_float') {
+        return array(
+          'value' => array(
+            'type'     => 'float',
+//             'length'   => $field['db_length'],
+//             'unsigned' => $field['db_unsigned'],
+            'not null' => FALSE,
+            'default'  => NULL,
+            'sortable' => TRUE
+          ),
+        );
+      }
+      if ($field['type'] == 'number_double') {
+        return array(
+          'value' => array(
+            'type'     => 'double',
+//             'length'   => $field['db_length'],
+//             'unsigned' => $field['db_unsigned'],
+            'not null' => FALSE,
+            'default'  => NULL,
+            'sortable' => TRUE
+          ),
         );
       }
-      if ($field['type'] == 'number_decimal') {
+//       if ($field['type'] == 'number_decimal') {
+//         return array(
+//           'value' => array(
+//             'type'     => 'decimal',
+//             'length'   => $field['db_length'],
+//             'unsigned' => $field['db_unsigned'],
+//             'not null' => FALSE,
+//             'default'  => NULL,
+//             'sortable' => TRUE
+//           ),
+//         );
+//       }
+      if ($field['type'] == 'number_decimal_10_2') {
         return array(
-          'value' => array('type' => 'float', 'not null' => FALSE, 'default' => NULL, 'sortable' => TRUE),
+          'value' => array(
+            'type'     => 'decimal',
+            'length'   => '10,2',
+            'not null' => FALSE,
+            'default'  => NULL,
+            'sortable' => TRUE
+          ),
         );
       }
 
@@ -143,6 +220,9 @@ function number_field($op, &$node, $fiel
             if (count($allowed_values) && !array_key_exists($item['value'], $allowed_values)) {
               form_set_error($error_field, t('Illegal value for %name.', array('%name' => t($field['widget']['label']))));
             }
+//             if ($field['db_unsigned'] && $item['value'] < 0) {
+//               form_set_error($error_field, t('Illegal value for %name. No negative values allowed.', array('%name' => t($field['widget']['label']))));
+//             }
           }
         }
       }
@@ -156,17 +236,17 @@ function number_field($op, &$node, $fiel
 function number_field_formatter_info() {
 
   return array(
-    'default' => array('label' => '9999',             'field types' => array('number_integer', 'number_decimal')),
-    'us_0'    => array('label' => '9,999',            'field types' => array('number_integer', 'number_decimal')),
-    'us_1'    => array('label' => '9,999.9',          'field types' => array('number_decimal')),
-    'us_2'    => array('label' => '9,999.99',         'field types' => array('number_decimal')),
-    'be_0'    => array('label' => '9.999',            'field types' => array('number_integer', 'number_decimal')),
-    'be_1'    => array('label' => '9.999, 9',         'field types' => array('number_decimal')),
-    'be_2'    => array('label' => '9.999, 99',        'field types' => array('number_decimal')),
-    'fr_0'    => array('label' => '9 999',            'field types' => array('number_integer', 'number_decimal')),
-    'fr_1'    => array('label' => '9 999, 9',         'field types' => array('number_decimal')),
-    'fr_2'    => array('label' => '9 999, 99',        'field types' => array('number_decimal')),
-    'unformatted' => array('label' => 'unformatted',  'field types' => array('number_integer', 'number_decimal')),
+    'default'     => array('label' => 'default',          'field types' => array('number_integer',  'number_float', 'number_double', 'number_decimal_10_2')),
+    'us_0'        => array('label' => '9,999',            'field types' => array('number_integer',  'number_float', 'number_double', 'number_decimal_10_2')),
+    'us_1'        => array('label' => '9,999.9',          'field types' => array(                   'number_float', 'number_double', 'number_decimal_10_2')),
+    'us_2'        => array('label' => '9,999.99',         'field types' => array(                   'number_float', 'number_double', 'number_decimal_10_2')),
+    'be_0'        => array('label' => '9.999',            'field types' => array('number_integer',  'number_float', 'number_double', 'number_decimal_10_2')),
+    'be_1'        => array('label' => '9.999, 9',         'field types' => array(                   'number_float', 'number_double', 'number_decimal_10_2')),
+    'be_2'        => array('label' => '9.999, 99',        'field types' => array(                   'number_float', 'number_double', 'number_decimal_10_2')),
+    'fr_0'        => array('label' => '9 999',            'field types' => array('number_integer',  'number_float', 'number_double', 'number_decimal_10_2')),
+    'fr_1'        => array('label' => '9 999, 9',         'field types' => array(                   'number_float', 'number_double', 'number_decimal_10_2')),
+    'fr_2'        => array('label' => '9 999, 99',        'field types' => array(                   'number_float', 'number_double', 'number_decimal_10_2')),
+    'unformatted' => array('label' => 'unformatted',      'field types' => array('number_integer',  'number_float', 'number_double', 'number_decimal_10_2')),
   );
 }
 
@@ -220,7 +300,7 @@ function number_field_formatter($field, 
     $value = number_format($item['value'], 2, ', ', ' ');
     break;
   default:
-    $value = number_format($item['value']);
+    $value = $item['value'];
     break;
   }
   $prefixes = explode('|', $field['prefix']);
@@ -252,7 +332,7 @@ function number_widget_info() {
   return array(
     'number' => array(
       'label' => 'Text Field',
-      'field types' => array('number_integer', 'number_decimal'),
+      'field types' => array('number_integer', 'number_float', 'number_double', 'number_decimal_10_2'),
     ),
   );
 }
@@ -300,7 +380,7 @@ function number_widget($op, &$node, $fie
               '#default_value' => $data['value'],
               '#required' => ($delta == 0) ? $field['required'] : FALSE,
               '#size' => 20,
-              '#maxlength' => 11,
+              '#maxlength' => 17,
               '#attributes' => array('class' => 'number'),
               '#field_prefix' => $prefix,
               '#field_suffix' => $suffix,
@@ -315,7 +395,7 @@ function number_widget($op, &$node, $fie
             '#default_value' => '',
             '#required' => ($delta == 0) ? $field['required'] : FALSE,
             '#size' => 20,
-            '#maxlength' => 11,
+            '#maxlength' => 17,
             '#attributes' => array('class' => 'number'),
             '#field_prefix' => $prefix,
             '#field_suffix' => $suffix,
@@ -330,7 +410,7 @@ function number_widget($op, &$node, $fie
           '#required' => $field['required'],
           '#description' => $field['widget']['description'],
           '#size' => 20,
-          '#maxlength' => 11,
+          '#maxlength' => 17,
           '#attributes' => array('class' => 'number'),
           '#field_prefix' => $prefix,
           '#field_suffix' => $suffix,
@@ -341,7 +421,7 @@ function number_widget($op, &$node, $fie
     case 'process form values':
       // Don't save empty fields.
       foreach ($items as $delta => $item) {
-        $items[$delta]['value'] = preg_replace('@[^0-9\.]@','',$items[$delta]['value']);
+        $items[$delta]['value'] = preg_replace('@[^-0-9\.]@','',$items[$delta]['value']);
       }
       if ($field['multiple']) {
         foreach ($items as $delta => $item) {
