从字符串中修剪 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++ 本地机
假设我有像“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++ 本地机