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 +}