有没有办法绕一个字符串?

时间:2017-12-06 16:32:17

标签: c++ string

所以我有一个例如"-389761456.6570000000"的字符串,我需要将这个数字四舍五入到dor后面的4个字符。我为此写了一个完整的函数,但它太长了(100行)。 我不能像这样转换它:

void Calculator::Display(string a)
{
    long double q = stod(a);
    cout << setprecision(4) << q << endl;
}

因为它看起来像这样(3.89e ^ -10等)(只是一个例子而不是真实的结果) 我想要这样的smth "-389761456.6570" 有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

当然,它只需要一些代码行;当然不是100.只考虑舍入规则:舍入到4位数,查看第5位数;如果它大于'5',请在第4位加一;如果它小于'5',则仅保留第4位数字;如果它恰好是'5',如果第四位数之后的任何内容不为零,则将第一位数加1;否则,应用你的抢七规则(从圆到偶,从圆到奇,向零舍入等)。当您向第4位添加一个数字时,它可能会从'9'翻转到大于'9'的某个位置;如果发生这种情况,请在第3位数字中加1,等等。完成所有操作后,丢弃第4位后的字符。

答案 1 :(得分:0)

这应该做你想要的。但是,使用系统库来实现这一点要容易得多。

#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";
}