This should do what you want. It's much easier to just use the system libraries to do this, though.
#include <iostream>
#include <string>
void increment( std::string& num )
{
for ( auto ch = num.rbegin(); ch != num.rend(); ch++ )
{
switch ( *ch )
{
case '9':
*ch = '0';
case '.':
continue;
case '-':
num.insert( 1, 1, '1' );
return;
default:
(*ch)++;
return;
}
}
num.insert( 0, 1, '1' );
}
std::string round( const std::string& num, size_t precision )
{
size_t dot = num.find( '.' );
if ( dot == std::string::npos || dot + precision >= num.size() )
{
return num;
}
size_t length = std::min( dot + precision + 1, num.size() );
char lastCh = num[ length ];
std::string result = num.substr( 0, length );
if ( lastCh >= '5' && lastCh <= '9' )
{
increment( result );
}
return result;
}
int main()
{
std::cout << round( "123.45", 4 ) << "\n";
std::cout << round( "123.456", 4 ) << "\n";
std::cout << round( "123.4567", 4 ) << "\n";
std::cout << round( "123.45678", 4 ) << "\n";
std::cout << round( "123.456789", 4 ) << "\n";
std::cout << round( "123.456723", 4 ) << "\n";
std::cout << round( "999.9999995", 4 ) << "\n";
std::cout << round( "-123.456723", 4 ) << "\n";
std::cout << round( "-999.9999995", 4 ) << "\n";
}