add number calculation in number form fields
authorWulf Coulmann <wulf@coulmann.de>
Wed, 10 Nov 2010 18:31:31 +0000 (19:31 +0100)
committerwulf@coulmann.de <wulf@coulmann.de>
Sun, 15 May 2011 09:07:14 +0000 (11:07 +0200)
SL/Form.pm
js/common.js

index cef5995..ad5f0a3 100644 (file)
@@ -1164,7 +1164,7 @@ sub parse_amount {
   if (   ($myconfig->{numberformat} eq '1.000,00')
       || ($myconfig->{numberformat} eq '1000,00')) {
     $amount =~ s/\.//g;
-    $amount =~ s/,/\./;
+    $amount =~ s/,/\./g;
   }
 
   if ($myconfig->{numberformat} eq "1'000.00") {
@@ -1172,10 +1172,17 @@ sub parse_amount {
   }
 
   $amount =~ s/,//g;
+  # make shure no code wich is not a math expression ends in eval()
+
+  $amount =~ s/\s//g; 
+
+  unless($amount =~ /^[-\+]?\d+\.?\d*([-\+\*\/][-\+]?\d+\.?\d*)*$/){
+    return 0;
+  }
 
   $main::lxdebug->leave_sub(2);
 
-  return ($amount * 1);
+  return (eval $amount) * 1 ;
 }
 
 sub round_amount {
index 86b869c..f568782 100644 (file)
@@ -48,27 +48,28 @@ function check_right_number_format(input_name) {
   if(decpoint == thpoint) {
     return show_alert_and_focus(input_name, wrongNumberFormat);
   }
-  if(decpoint == ',') {
-    var decnumbers = input_name.value.split(',');
+  var test_val = input_name.value;
+  if(thpoint && thpoint == ','){
+    test_val = test_val.replace(/,/g, '');
   }
-  else {
-    var decnumbers = input_name.value.split('.');
-  }
-  if(decnumbers.length == 2) {
-    if(decnumbers[1].length > 2)  {
-     /* return show_alert_and_focus(input_name, wrongNumberFormat); */
-    }
+  if(thpoint && thpoint == '.'){
+    test_val = test_val.replace(/\./g, '');
   }
-  else {
-    if(decnumbers.length > 2) {
-      return show_alert_and_focus(input_name, wrongNumberFormat);
-    }
-    if(!thpoint) {
-      if(decnumbers[0].match(/\D/)) {
-        return show_alert_and_focus(input_name, wrongNumberFormat);
-      }
-    }
+  if(thpoint && decpoint == ','){
+    test_val = test_val.replace(/,/g, '.');
   }
+
+  var forbidden = test_val.match(/[^-\+\/\*\.0-9\ ]/g );
+  if (forbidden && forbidden.length > 0 ){
+    return show_alert_and_focus(input_name, wrongNumberFormat);
+  } 
+
+  try{ 
+    eval(test_val);
+  }catch(err){
+    return show_alert_and_focus(input_name, wrongNumberFormat);
+  } 
+
 }
 
 function check_right_date_format(input_name) {