|
@@ -179,13 +179,13 @@ namespace bf
|
|
struct Float
|
|
struct Float
|
|
{
|
|
{
|
|
private:
|
|
private:
|
|
- BFRT_EXPORT static int ToString(float f, char* outStr);
|
|
|
|
|
|
+ BFRT_EXPORT static int ToString(float f, char* outStr, bool roundTrip);
|
|
};
|
|
};
|
|
|
|
|
|
struct Double
|
|
struct Double
|
|
{
|
|
{
|
|
private:
|
|
private:
|
|
- BFRT_EXPORT static int ToString(double f, char* outStr);
|
|
|
|
|
|
+ BFRT_EXPORT static int ToString(double f, char* outStr, bool roundTrip);
|
|
};
|
|
};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -932,9 +932,29 @@ void bf::System::FFI::FFILIB::Call(bf::System::FFI::FFILIB::FFICIF* cif, void* f
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-static int ToString(float d, char* outStr)
|
|
|
|
|
|
+static int ToString(float d, char* outStr, bool roundTrip)
|
|
{
|
|
{
|
|
- sprintf(outStr, "%1.9g", d);
|
|
|
|
|
|
+ if (!roundTrip)
|
|
|
|
+ {
|
|
|
|
+ int digits;
|
|
|
|
+ if (d > 100000)
|
|
|
|
+ digits = 1;
|
|
|
|
+ else if (d > 10000)
|
|
|
|
+ digits = 2;
|
|
|
|
+ else if (d > 1000)
|
|
|
|
+ digits = 3;
|
|
|
|
+ else if (d > 100)
|
|
|
|
+ digits = 4;
|
|
|
|
+ else if (d > 10)
|
|
|
|
+ digits = 5;
|
|
|
|
+ else
|
|
|
|
+ digits = 6;
|
|
|
|
+
|
|
|
|
+ sprintf(outStr, "%1.*f", digits, d);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ sprintf(outStr, "%1.9g", d);
|
|
|
|
+
|
|
int len = (int)strlen(outStr);
|
|
int len = (int)strlen(outStr);
|
|
for (int i = 0; outStr[i] != 0; i++)
|
|
for (int i = 0; outStr[i] != 0; i++)
|
|
{
|
|
{
|
|
@@ -947,7 +967,11 @@ static int ToString(float d, char* outStr)
|
|
if (c == '.')
|
|
if (c == '.')
|
|
{
|
|
{
|
|
return checkC;
|
|
return checkC;
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+ else if (c == 'e')
|
|
|
|
+ {
|
|
|
|
+ return len;
|
|
|
|
+ }
|
|
else if (c != '0')
|
|
else if (c != '0')
|
|
{
|
|
{
|
|
for (int j = i + 1; j <= checkC; j++)
|
|
for (int j = i + 1; j <= checkC; j++)
|
|
@@ -977,9 +1001,37 @@ static int ToString(float d, char* outStr)
|
|
return len;
|
|
return len;
|
|
}
|
|
}
|
|
|
|
|
|
-static int ToString(double d, char* outStr)
|
|
|
|
|
|
+static int ToString(double d, char* outStr, bool roundTrip)
|
|
{
|
|
{
|
|
- sprintf(outStr, "%1.17g", d);
|
|
|
|
|
|
+ if (!roundTrip)
|
|
|
|
+ {
|
|
|
|
+ int digits;
|
|
|
|
+ if (d > 1000000000)
|
|
|
|
+ digits = 1;
|
|
|
|
+ else if (d > 100000000)
|
|
|
|
+ digits = 2;
|
|
|
|
+ else if (d > 10000000)
|
|
|
|
+ digits = 3;
|
|
|
|
+ else if (d > 1000000)
|
|
|
|
+ digits = 4;
|
|
|
|
+ else if (d > 100000)
|
|
|
|
+ digits = 5;
|
|
|
|
+ else if (d > 10000)
|
|
|
|
+ digits = 6;
|
|
|
|
+ else if (d > 1000)
|
|
|
|
+ digits = 7;
|
|
|
|
+ else if (d > 100)
|
|
|
|
+ digits = 8;
|
|
|
|
+ else if (d > 10)
|
|
|
|
+ digits = 9;
|
|
|
|
+ else
|
|
|
|
+ digits = 10;
|
|
|
|
+
|
|
|
|
+ sprintf(outStr, "%1.*f", digits, d);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ sprintf(outStr, "%1.17g", d);
|
|
|
|
+
|
|
int len = (int)strlen(outStr);
|
|
int len = (int)strlen(outStr);
|
|
for (int i = 0; outStr[i] != 0; i++)
|
|
for (int i = 0; outStr[i] != 0; i++)
|
|
{
|
|
{
|
|
@@ -1026,22 +1078,22 @@ static int ToString(double d, char* outStr)
|
|
return len;
|
|
return len;
|
|
}
|
|
}
|
|
|
|
|
|
-int Float::ToString(float f, char* outStr)
|
|
|
|
|
|
+int Float::ToString(float f, char* outStr, bool roundTrip)
|
|
{
|
|
{
|
|
#ifdef USE_CHARCONV
|
|
#ifdef USE_CHARCONV
|
|
auto result = std::to_chars(outStr, outStr + 256, f);
|
|
auto result = std::to_chars(outStr, outStr + 256, f);
|
|
return (int)(result.ptr - outStr);
|
|
return (int)(result.ptr - outStr);
|
|
#else
|
|
#else
|
|
- return ::ToString(f, outStr);
|
|
|
|
|
|
+ return ::ToString(f, outStr, roundTrip);
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
-int Double::ToString(double d, char* outStr)
|
|
|
|
|
|
+int Double::ToString(double d, char* outStr, bool roundTrip)
|
|
{
|
|
{
|
|
#ifdef USE_CHARCONV
|
|
#ifdef USE_CHARCONV
|
|
auto result = std::to_chars(outStr, outStr + 256, d);
|
|
auto result = std::to_chars(outStr, outStr + 256, d);
|
|
return (int)(result.ptr - outStr);
|
|
return (int)(result.ptr - outStr);
|
|
#else
|
|
#else
|
|
- return ::ToString(d, outStr);
|
|
|
|
|
|
+ return ::ToString(d, outStr, roundTrip);
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|