Hi Luigi,
This problem was discussed on the Russian Harbour forum too.
Please take a look for the results of the sample below:
proc main
LOCAL number := 1.0001
LOCAL decPart := number - INT( number )
Local cld := ld_set( decPart )
? hb_NtoC( decPart ) // 22
? ld_str(cld, 8) // 0.000100
? ld_str(cld,, 18)
? ld_str(cld, 24, Len( hb_NtoC( decPart ) ))
? ld_str(cld, 40, 34)
wait
retu
#pragma BEGINDUMP
#include "hbapi.h"
#define ld_len sizeof( long double )
typedef union
{
long double value;
char string[ ld_len ];
} xld16;
HB_FUNC( LD_SET )
{
xld16 ld;
ld.value = hb_parnd( 1 );
hb_retclen( ( char * ) &ld, ld_len );
}
static xld16 ld_get( int iPar )
{
HB_SIZE ulLen = hb_parclen( iPar );
const char *szLD = hb_parc( iPar );
xld16 ld;
if( ulLen == ld_len )
memcpy( &ld.string, szLD, ld_len );
else
ld.value = 0.0;
return ld;
}
HB_FUNC( LD_GET )
{
xld16 ld = ld_get( 1 );
hb_retnd( ld.value );
}
HB_FUNC( LD_ADD )
{
xld16 ld1 = ld_get( 1 );
xld16 ld2 = ld_get( 2 );
xld16 ld;
ld.value = ld1.value + ld2.value;
hb_retclen( ( char * ) &ld, ld_len );
}
HB_FUNC( LD_SUB )
{
xld16 ld1 = ld_get( 1 );
xld16 ld2 = ld_get( 2 );
xld16 ld;
ld.value = ld1.value - ld2.value;
hb_retclen( ( char * ) &ld, ld_len );
}
HB_FUNC( LD_MUL )
{
xld16 ld1 = ld_get( 1 );
xld16 ld2 = ld_get( 2 );
xld16 ld;
ld.value = ld1.value * ld2.value;
hb_retclen( ( char * ) &ld, ld_len );
}
HB_FUNC( LD_DIV )
{
xld16 ld1 = ld_get( 1 );
xld16 ld2 = ld_get( 2 );
xld16 ld;
ld.value = ld1.value / ld2.value;
hb_retclen( ( char * ) &ld, ld_len );
}
HB_FUNC( LD_STR )
{
int iLen = hb_parni( 2 ), iDec = hb_parni( 3 ), iLen1;
xld16 ld = ld_get( 1 );
char szStr[50];
char sFormat[10];
int iFmtLen = 1;
sFormat[0] = '%';
if( iDec > 0 )
{
char sDec[10];
sFormat[1] = '.';
itoa( iDec, sDec, 10 );
memcpy( sFormat + 2, sDec, strlen( sDec ) );
iFmtLen += 1 + strlen( sDec );
}
sFormat[ iFmtLen ] = 'L';
sFormat[ iFmtLen + 1 ] = 'f';
sFormat[ iFmtLen + 2 ] = 0;
#if defined(__MINGW32__) || defined(__MINGW64__)
__mingw_snprintf(szStr, 50, sFormat, ld.value );
#else
snprintf(szStr, 50, sFormat, ld.value );
#endif
iLen1 = strlen( szStr );
if( iLen > 0 && iLen > iLen1 )
{
if( iLen1 < iLen && iLen < 39 )
{
int i;
for( i = iLen1 - 1; i >= 0; i -- )
szStr[ i + ( iLen - iLen1 )] = szStr[ i ];
memset( szStr, ' ', iLen - iLen1 );
iLen1 = iLen;
}
}
hb_retclen( szStr, iLen1 );
}
#pragma ENDDUMP
May be it is a solution for you...
Regards,
Grigory
понедельник, 21 ноября 2022 г. в 16:30:31 UTC+1, Luigi Ferraris: