5278211db6fb0753c85e342e77c919db67d9a468
[occt.git] / src / OSD / OSD_Real2String.cxx
1 // File:        OSD_Real2String.cxx
2 // Created:     Fri Jan 25 12:58:55 2002
3 // Author:      doneux <doneux@samcef.com>
4
5 // Lastly modified by :
6 // +---------------------------------------------------------------------------+
7 // !   doneux ! Creation                                !  06/17/02!    %V%-1!
8 // +---------------------------------------------------------------------------+
9
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13
14 #include <OSD_Real2String.ixx>
15 #include <stdio.h>
16 #if defined(HAVE_STDLIB_H) || defined(WNT)
17 # include <stdlib.h>
18 #endif
19
20 //=======================================================================
21 //function : OSD_Real2String
22 //purpose  : 
23 //=======================================================================
24
25 OSD_Real2String::OSD_Real2String():
26  myReadDecimalPoint(0)
27 {
28   float F1 = (float ) 1.1 ;
29   char str[5] ;
30
31   sprintf(str,"%.1f",F1) ;
32                              //  printf("%s\n",str) ;
33   myLocalDecimalPoint = str[1] ;
34 }
35
36 //=======================================================================
37 //function : RealToCString
38 //purpose  : 
39 //=======================================================================
40
41 Standard_Boolean OSD_Real2String::RealToCString(const Standard_Real theReal,
42                                                 Standard_PCharacter& theString) const
43 {
44   char *p, *q ;
45
46   if (sprintf(theString,"%.17e",theReal)  <= 0) 
47     return Standard_False ;
48
49   // Suppress "e+00" and unsignificant 0's 
50
51   if ((p = strchr(theString,'e'))) {
52     if (!strcmp(p,"e+00"))
53       *p = 0 ;
54     for (q = p-1 ; *q == '0' ; q--) ;
55     if (q != p-1) {
56  
57       if (*q != myLocalDecimalPoint) q++ ;
58
59       while (*p)
60         *q++ = *p++ ;
61       *q = 0 ;
62     }
63   }
64   return Standard_True ;
65 }
66
67 //=======================================================================
68 //function : CStringToReal
69 //purpose  : 
70 //=======================================================================
71
72 Standard_Boolean OSD_Real2String::CStringToReal(const Standard_CString theString,
73                                                 Standard_Real& theReal)
74 {
75   char *endptr ;
76
77   if (! theString) return Standard_False;
78
79    // Get the decimal point character in the string (if any)
80   if (!myReadDecimalPoint) {
81     if (strchr(theString, ',')) myReadDecimalPoint = ',';
82     else if (strchr(theString, '.')) myReadDecimalPoint = '.';
83   }
84
85
86   const char *str = theString;
87   if (myReadDecimalPoint) {
88       if (myReadDecimalPoint != myLocalDecimalPoint) {
89           const char * p;
90           char buff[1024]; 
91           // replace the decimal point by the local one
92           if(myReadDecimalPoint != myLocalDecimalPoint && 
93              (p = strchr(theString,myReadDecimalPoint))&& ((p-theString) < 1000) )
94           {
95             strncpy(buff, theString, 1000);
96             buff[p-theString] = myLocalDecimalPoint;
97             str = buff;
98           }
99       }
100   }
101
102   theReal = strtod(str,&endptr) ;
103   if (*endptr)
104     return Standard_False ;
105
106   return Standard_True;
107 }
108