Author: cosurgi
Date: 2009-05-09 01:47:08 +0200 (Sat, 09 May 2009)
New Revision: 1769

Modified:
   trunk/lib/serialization-qt/QtGUIGenerator.cpp
Log:
sanitize stupid numers in QtGUI, eg. 0.1299999999999 becomes 0.13



Modified: trunk/lib/serialization-qt/QtGUIGenerator.cpp
===================================================================
--- trunk/lib/serialization-qt/QtGUIGenerator.cpp       2009-05-05 20:44:59 UTC 
(rev 1768)
+++ trunk/lib/serialization-qt/QtGUIGenerator.cpp       2009-05-08 23:47:08 UTC 
(rev 1769)
@@ -87,7 +87,96 @@
        }
 }
 
+std::string sanitize(const std::string num)
+{
+       std::string ret="";
+       int len=num.size();
+       if(len < 7 )
+               return num;
+       // is that a number?
+       try
+       {
+               Real v = boost::lexical_cast<Real>(num);
+       }
+       catch(std::bad_cast&)
+       {
+               return num;
+       }
+       // case .....000001
+       if(num[len-2] == '0' && num[len-3] == '0')
+       {
+               for(int pos=len-4 ; pos>=0 ; --pos)
+               {
+                       if(ret.size() != 0 || num[pos] != '0' || num[pos-1] == 
'.')
+                       {
+                               ret = num[pos] + ret;
+                       }
+               }
+       }
+       else 
+       {// case ....9999998
+               if(num[len-2] == '9' && num[len-3] == '9')
+               {
+                       for(int pos=len-4 ; pos>=0 ; --pos)
+                       {
+                               if(ret.size() != 0 || num[pos] != '9')
+                               {
+                                       if(ret.size() == 0)
+                                       {
+                                               ret = (unsigned 
char)((int)(num[pos])+1);
+                                       }
+                                       else
+                                       {
+                                               ret = num[pos] + ret;
+                                       }
+                               }
+                       }
+               }
+               else
+               {// exponential part e-..
+                       if(num[len-3] == '-' && num[len-4] == 'e')
+                       {
+                               std::string exp 
=std::string("e-")+num[len-2]+num[len-1];
+                               std::string mant="";
+                               for(int pos=len-5 ; pos>=0 ; --pos)
+                               {
+                                       mant = num[pos] + mant;
+                               }
+                               ret=sanitize(mant)+exp;
+                       }
+                       else
+                       {// exponential part e..
+                               if(num[len-3] == 'e')
+                               {
+                                       std::string exp 
=std::string("e")+num[len-2]+num[len-1];
+                                       std::string mant="";
+                                       for(int pos=len-4 ; pos>=0 ; --pos)
+                                       {
+                                               mant = num[pos] + mant;
+                                       }
+                                       ret=sanitize(mant)+exp;
+                               }
+                               else
+                               {
+                                       return num;
+                               }
+                       }
+               }
+       }
+       Real a = boost::lexical_cast<Real>(ret);
+       Real b = boost::lexical_cast<Real>(num);
+       if(a-b == 0) // the sanitized number and original numer must be exactly 
the same
+       {
+               return ret;
+       }
+       else
+       {
+               std::cerr << "INFO: sanitize failed: " << a << " != " << b << 
"\n";
+               return num; // return original numer, since they are different
+       }
+};
 
+
 void QtGUIGenerator::buildGUI(shared_ptr<Serializable> s,  QWidget * widget)
 {
 
@@ -142,7 +231,7 @@
                                else
                                {
                                        QLineEdit* le = new QLineEdit(widget);
-                                       le->setText(descriptor->strings[i]);
+                                       
le->setText(sanitize(descriptor->strings[i]));
                                        descriptor->widgets.push_back(le);
                                        
descriptor->types.push_back(AttributeDescriptor::FLOATING);
                                }


_______________________________________________
Mailing list: https://launchpad.net/~yade-dev
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yade-dev
More help   : https://help.launchpad.net/ListHelp
_______________________________________________
yade-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/yade-dev

Reply via email to