c++ 使用boost格式化负数

um6iljoc  于 2023-03-25  发布在  其他
关注(0)|答案(2)|浏览(184)

我想使用boost::format以以下格式获取以分钟为单位接收的某个UTC偏移量:

120: +0200
-120: -0200

我使用了以下函数:

void printData(const int dat)
{
    std::string data;
    if (dat >= 0)
    {
        data = (boost::format("+%02d%02d") % (dat/60) % (dat%60)).str();
    }
    else
    {
        data = (boost::format("%03d%02d") % (dat/60) % (dat%60)).str();
    }
    
    std::cout<<" " << data << "\n";
}

它应该适用于以下情况:

// 1: 0-10  (+, -)
    // 1.1 fix hour
       std::cout<<"1:\n";
       std::cout<<"1.1:\n";
       printData(540); // +9 hours -> OK (+0900)
       printData(-540); // -9 hours -> OK (-0900)
       printData(600); // +10 hours -> OK (+1000)
       printData(-600); // -10 hours -> OK (-1000)
    // 1.2 half hour
        std::cout<<"1.2:\n";
        printData(570); // +9:30 hours -> OK (+0930)
        printData(-570); // -9:30 hours -> NOK -> (-09-30) // -0930 should be
    // 1.3 three quarte an hour
        std::cout<<"1.3:\n";
        printData(585); // +9:40 hours -> OK (+0945)
        printData(-585); // -9:45 hours -> NOK -> (-09-40) // -0945 should be
        std::cout<<"\n";

    std::cout<<"\n2:\n";
    // 2: 11-14 (+, -):
    // 2.1 fix hour
        std::cout<<"2.1:\n";
       printData(660); // +11 hours -> OK (+1100)
       printData(-660); // -11 hours -> OK (-1100)
    // 2.2 half hour
         std::cout<<"2.2:\n";
        printData(690); // +11:30 hours -> OK (+1130)
        printData(-690); // -11:30 hours -> NOK -> (-11-30) // -1130 should be
    // 2.3 three quarte an hour
        std::cout<<"2.3:\n";
        printData(705); // +11:45 hours -> OK (+1145)
        printData(-705); // -11:45 hours -> NOK -> (-11-45) // -1145 should be
        std::cout<<"\n";

是否可以使用boost::format来支持所有情况?https://godbolt.org/z/5Mfs5Yh6z

i2byvkas

i2byvkas1#

你可以使用一个临时变量来表示符号,当dat为负时取反。所以,你可以在两种情况下使用相同的boost::format行(减少重复代码):

void printData(int dat)
{
    char sign = '+';
    if (dat < 0)
    {
        dat = -dat;
        sign = '-';
    }
    std::string data = (boost::format("%c%02d%02d") % sign % (dat/60) % (dat%60)).str();
    std::cout<<" " << data << "\n";
}

https://godbolt.org/z/7YPbejsj3
更简单的方法是使用iostream中的std::printf,它与C版本的语法相同:

void printData(int dat)
{
    char sign = '+';
    if (dat < 0)
    {
        dat = -dat;
        sign = '-';
    }
    std::printf("%c%02d%02d\n", sign, dat/60, dat%60);
}

https://godbolt.org/z/Ea76P5srs

6l7fqoea

6l7fqoea2#

您可以对输入求反并使用它进行格式化。

void printData(const int dat)
{
    std::string data;
    if (dat >= 0)
    {
        data = (boost::format("+%02d%02d") % (dat/60) % (dat%60)).str();
    }
    else
    {
        int dat2 = -dat;
        data = (boost::format("-%02d%02d") % (dat2/60) % (dat2%60)).str();
    }
    
    std::cout<<" " << data << "\n";
}

相关问题