从字符串中修剪 0

Trimming 0 from a string

假设我有像“0003443”这样的字符串,我们的目标是实现“3443”。我已经使用子字符串方法找出零的数量来完成此操作,但我想知道在 C++ 中执行此操作的最佳方法。

您可以 test/run 此代码 https://repl.it/@JomaCorpFX/TrimLeftZeros#main.cpp

代码

#include <iostream>
#include <regex>
#include <stdexcept>
#include <chrono>


time_t CurrentEpochMilliseconds()
{
    using namespace std::chrono;
    return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
}

std::string TrimZeros1(const std::string& number)
{
    std::regex regex(u8"[-+]?[0-9]{1,}", std::regex_constants::ECMAScript); 
    if(!std::regex_match(number, regex)) //Validating number format +XXXXX or -XXXXX or XXXXX
    {
        throw std::invalid_argument("Invalid parameter, it is not a number.");
    }

    std::string result = number;
    size_t pos = 0;
    if(result[0] == '+') 
    {
        result.erase(0,1);
    }
    if(result[0] == '-')
    {
        pos = 1;
    }

    while (result.size()>0 && result[pos]== '0') 
    {
        result.erase(pos,1); //Erase first char. Pos = pos, Count = 1
    }
    return (pos == 1 && result.size() ==1) || result.size() == 0 ? u8"0" : result; 
}

std::string TrimZeros2(const std::string& number)
{
    std::regex regex(u8"[-+]?[0-9]{1,}", std::regex_constants::ECMAScript);
    if(!std::regex_match(number, regex))
    {
        throw std::invalid_argument("Invalid parameter, it is not a number.");
    }

    int result = std::stoi(number);
    return std::to_string(result);
}

int main()
{
    std::cout<<u8"--- TrimZeros1"<< std::endl;
    std::cout<< TrimZeros1(u8"0003443") << std::endl;
    std::cout<< TrimZeros1(u8"0000123") << std::endl;
    std::cout<< TrimZeros1(u8"0000789") << std::endl;
    std::cout<< TrimZeros1(u8"0000000") << std::endl;

    std::cout<< TrimZeros1(u8"+0003443") << std::endl;
    std::cout<< TrimZeros1(u8"+0000123") << std::endl;
    std::cout<< TrimZeros1(u8"+0000789") << std::endl;
    std::cout<< TrimZeros1(u8"+0000000") << std::endl;

    std::cout<< TrimZeros1(u8"-0003443") << std::endl;
    std::cout<< TrimZeros1(u8"-0000123") << std::endl;
    std::cout<< TrimZeros1(u8"-0000789") << std::endl;
    std::cout<< TrimZeros1(u8"-0000000") << std::endl;

    std::cout <<std::endl;

    std::cout<<u8"--- TrimZeros2"<< std::endl;
    std::cout<< TrimZeros2(u8"0003443") << std::endl;
    std::cout<< TrimZeros2(u8"0000123") << std::endl;
    std::cout<< TrimZeros2(u8"0000789") << std::endl;
    std::cout<< TrimZeros2(u8"0000000") << std::endl;

    std::cout<< TrimZeros2(u8"+0003443") << std::endl;
    std::cout<< TrimZeros2(u8"+0000123") << std::endl;
    std::cout<< TrimZeros2(u8"+0000789") << std::endl;
    std::cout<< TrimZeros2(u8"+0000000") << std::endl;

    std::cout<< TrimZeros2(u8"-0003443") << std::endl;
    std::cout<< TrimZeros2(u8"-0000123") << std::endl;
    std::cout<< TrimZeros2(u8"-0000789") << std::endl;
    std::cout<< TrimZeros2(u8"-0000000") << std::endl;

    //std::cout<< TrimZeros2(u8"") << std::endl; //Error it is not a valid number value.

    std::cout <<std::endl;
    std::cout <<std::endl;

    int iterations = 10000;
    std::cout<<u8"--- Started - TrimZeros1 - Time Test"<< std::endl;
    time_t actual = CurrentEpochMilliseconds();
    for(int i = 0; i< iterations; i++)
    {
        TrimZeros1(u8"+0000000");
        TrimZeros1(u8"-0000000");
        TrimZeros1(u8"0000000");
        TrimZeros1(u8"+1111112");
        TrimZeros1(u8"-1111112");
        TrimZeros1(u8"1111112");
    }
    actual = CurrentEpochMilliseconds() - actual;
    std::cout << ("Elapsed seconds = " + std::to_string(actual / 1000.0) + "  ---  Elapsed milliseconds = " + std::to_string(actual) + "  ---  Elapsed minutes = " + std::to_string((actual / 1000.0) / 60.0)) << std::endl;
std::cout <<std::endl;
    std::cout <<std::endl;

    
    std::cout<<u8"--- Started - TrimZeros2 - Time Test"<< std::endl;
    actual = CurrentEpochMilliseconds();
    for(int i = 0; i< iterations; i++)
    {
        TrimZeros2(u8"+0000000");
        TrimZeros2(u8"-0000000");
        TrimZeros2(u8"0000000");
        TrimZeros2(u8"+1111112");
        TrimZeros2(u8"-1111112");
        TrimZeros2(u8"1111112");
    }
    actual = CurrentEpochMilliseconds() - actual;
    std::cout << ("Elapsed seconds = " + std::to_string(actual / 1000.0) + "  ---  Elapsed milliseconds = " + std::to_string(actual) + "  ---  Elapsed minutes = " + std::to_string((actual / 1000.0) / 60.0)) << std::endl;
    std::cout <<std::endl;
    std::cout <<std::endl;

    std::cout<< u8"Press enter to continue... ";
    std::cin.get();
    return EXIT_SUCCESS;
}

输出

--- TrimZeros1
3443
123
789
0
3443
123
789
0
-3443
-123
-789
0

--- TrimZeros2
3443
123
789
0
3443
123
789
0
-3443
-123
-789
0


--- Started - TrimZeros1 - Time Test
Elapsed seconds = 106.251000  ---  Elapsed milliseconds = 106251  ---  Elapsed minutes = 1.770850


--- Started - TrimZeros2 - Time Test
Elapsed seconds = 99.248000  ---  Elapsed milliseconds = 99248  ---  Elapsed minutes = 1.654133


Press enter to continue...

clang++ - web/online https://repl.it

g++ 本地机器

clang++ 本地机