Commit 6231ce59 authored by Dick Hollenbeck's avatar Dick Hollenbeck
Browse files

fix buggy double2str()

parent 57b30ad2
Loading
Loading
Loading
Loading
+6 −5
Original line number Original line Diff line number Diff line
@@ -89,10 +89,8 @@ wxString BOARD_ITEM::GetLayerName() const
std::string BOARD_ITEM::FormatInternalUnits( int aValue )
std::string BOARD_ITEM::FormatInternalUnits( int aValue )
{
{
    char    buf[50];
    char    buf[50];

    double  mm = aValue / IU_PER_MM;

    int     len;
    int     len;
    double  mm = aValue / IU_PER_MM;


    if( mm != 0.0 && fabs( mm ) <= 0.0001 )
    if( mm != 0.0 && fabs( mm ) <= 0.0001 )
    {
    {
@@ -101,6 +99,9 @@ std::string BOARD_ITEM::FormatInternalUnits( int aValue )
        while( --len > 0 && buf[len] == '0' )
        while( --len > 0 && buf[len] == '0' )
            buf[len] = '\0';
            buf[len] = '\0';


        if( buf[len] == '.' )
            buf[len] = '\0';
        else
            ++len;
            ++len;
    }
    }
    else
    else
+47 −12
Original line number Original line Diff line number Diff line
@@ -64,27 +64,62 @@ static const wxString traceFootprintLibrary( wxT( "KicadFootprintLib" ) );


// Helper function to print a float number without using scientific notation
// Helper function to print a float number without using scientific notation
// and no trailing 0
// and no trailing 0
// For many reasons, S-expr does not accept scientific notation

// for floating numbers, so we cannot use the %g format to print a fp number
#if 0
// and %f leaves trailing 0.
// Does not work for aValue < 0.0001 and > 0.
// this helper function uses the %f format, and then removes trailing 0
// Will need to support exponents in DSNLEXER if we get exponents > 16, i.e. the "precision".
std::string double2str( double aValue )
std::string double2str( double aValue )
{
{
    char    buf[50];
    char    buf[50];
    int len = sprintf( buf, "%.16f", aValue );
    int     len;

    if( aValue != 0.0 && fabs( aValue ) <= 0.0001 )
    {
        len = sprintf( buf, "%.10f", aValue );


        while( --len > 0 && buf[len] == '0' )
        while( --len > 0 && buf[len] == '0' )
            buf[len] = '\0';
            buf[len] = '\0';


    // Remove useless separator:
        if( buf[len] == '.' )
        if( buf[len] == '.' )
        buf[len] = '\0';
            buf[len--] = '\0';
    else

        ++len;
        ++len;
    }
    else
    {
        len = sprintf( buf, "%.10g", mm );
    }


    return std::string( buf, len );
    return std::string( buf, len );
}
}


#else
// this one handles 0.00001 ok, and 1.222222222222222 ok, previous did not.
std::string double2str( double aValue )
{
    char    buf[50];
    int     len;

    if( aValue != 0.0 && fabs( aValue ) <= 0.0001 )
    {
        len = sprintf( buf,  "%.16f", aValue );

        while( --len > 0 && buf[len] == '0' )
            buf[len] = '\0';

        if( buf[len] == '.' )
            buf[len] = '\0';
        else
            ++len;
    }
    else
    {
        len = sprintf( buf, "%.16g", aValue );
    }

    return std::string( buf, len );;
}
#endif




/**
/**