From 7c8217821479043f78d6f2aa310ed60ff395b025 Mon Sep 17 00:00:00 2001 From: Walter Negro Date: Mon, 18 Feb 2002 03:02:58 +0000 Subject: [PATCH] 2002-02-17 20:30 UTC-0300 Walter Negro * source/vm/itemapi.c ! hb_itemStr() - Eliminated the limit of 9 decimals if not SET FIXED ON ! hb_itemStr() - Rounded starting from 17th less significant number. This is the behavior of Clipper. Ex: Before ? str( 1191.63, 20, 15 ) -> 1191.629999999999882 Now ? str( 1191.63, 20, 15 ) -> 1191.630000000000000 --- harbour/source/vm/itemapi.c | 42 ++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/harbour/source/vm/itemapi.c b/harbour/source/vm/itemapi.c index 20821b291a..50cd066171 100644 --- a/harbour/source/vm/itemapi.c +++ b/harbour/source/vm/itemapi.c @@ -1059,9 +1059,12 @@ char * hb_itemStr( PHB_ITEM pNumber, PHB_ITEM pWidth, PHB_ITEM pDec ) if( hb_set.HB_SET_FIXED ) /* If fixed mode is enabled, always use the default. */ iDec = hb_set.HB_SET_DECIMALS; + + /* Otherwise, the maximum is 9. Why? */ +/* else if( iDec > 9 ) - /* Otherwise, the maximum is 9. */ iDec = 9; +*/ if( pWidth ) { @@ -1130,13 +1133,42 @@ char * hb_itemStr( PHB_ITEM pNumber, PHB_ITEM pWidth, PHB_ITEM pDec ) iBytes = iSize + 1; else { + int iDecR; + if( HB_IS_DOUBLE( pNumber ) && iDec < pNumber->item.asDouble.decimal ) dNumber = hb_numRound( dNumber, iDec ); - if( iDec == 0 ) - iBytes = sprintf( szResult, "%*.0f", iSize, dNumber ); + if( dNumber != 0.0 ) + { + iDecR = 15 - ( int ) log10( fabs( dNumber ) ); + if(( dNumber < 1 ) && ( dNumber > -1 )) iDecR++; + } else - iBytes = sprintf( szResult, "%*.*f", iSize, iDec, dNumber ); + iDecR = iDec; + + if( iDecR >= 0 ) + { + + if( iDec == 0 ) + iBytes = sprintf( szResult, "%*.0f", iSize, dNumber ); + else + { + if( iDec <= iDecR ) + iBytes = sprintf( szResult, "%*.*f", iSize, iDec, dNumber ); + else + { + if( iDecR == 0 ) iDecR++; + iBytes = sprintf( szResult, "%*.*f%0*u", iSize-iDec+iDecR, iDecR, dNumber, iDec-iDecR, 0 ); + } + } + + } + else + + if( iDec == 0 ) + iBytes = sprintf( szResult, "%*.0f%0*u", iSize + iDecR , dNumber / pow( 10.0, ( double ) ( -iDecR ) ), -iDecR, 0 ); + else + iBytes = sprintf( szResult, "%*.0f%0*u.%0*u", iSize + iDecR - iDec - 1 , dNumber / pow( 10.0, ( double ) ( -iDecR ) ), -iDecR, 0, iDec, 0 ); } } else @@ -1311,4 +1343,4 @@ PHB_ITEM hb_itemValToStr( PHB_ITEM pItem ) hb_xfree( buffer ); return pResult; -} \ No newline at end of file +}