[Strings] Add more number formatters (#2873)

* [Strings] Add more number formatters

# Notes
- Adds `Strings::ToUnsignedInt` for `uint32` support.
- Adds `Strings::ToBigInt` for `int64` support.
- Adds `Strings::ToUnsignedBigInt` for `uint64` support.
- Adds `Strings::ToFloat` for `float` support.
- Replaces all `std::stoi` references with `Strings::ToInt`.
- Replaces all `atoi` references with `Strings::ToInt`.
- Replaces all `std::stoul` references with `Strings::ToUnsignedInt`.
- Replaces all `atoul` references with `Strings::ToUnsignedInt`.
- Replaces all `std::stoll` references with `Strings::ToBigInt`.
- Replaces all `atoll` references with `Strings::ToBigInt`.
- Replaces all `std::stoull` references with `Strings::ToUnsignedBigInt`.
- Replaces all `atoull` references with `Strings::ToUnsignedBigInt`.
- Replaces all `std::stof` references with `Strings::ToFloat`.

* [Strings] Add more number formatters

- Adds `Strings::ToUnsignedInt` for `uint32` support.
- Adds `Strings::ToBigInt` for `int64` support.
- Adds `Strings::ToUnsignedBigInt` for `uint64` support.
- Adds `Strings::ToFloat` for `float` support.
- Replaces all `std::stoi` references with `Strings::ToInt`.
- Replaces all `atoi` references with `Strings::ToInt`.
- Replaces all `std::stoul` references with `Strings::ToUnsignedInt`.
- Replaces all `atoul` references with `Strings::ToUnsignedInt`.
- Replaces all `std::stoll` references with `Strings::ToBigInt`.
- Replaces all `atoll` references with `Strings::ToBigInt`.
- Replaces all `std::stoull` references with `Strings::ToUnsignedBigInt`.
- Replaces all `atoull` references with `Strings::ToUnsignedBigInt`.
- Replaces all `std::stof` references with `Strings::ToFloat`.

* Rebase cleanup

* Changes/benchmarks/tests

---------

Co-authored-by: Akkadius <akkadius1@gmail.com>
This commit is contained in:
Alex King
2023-03-04 18:01:19 -05:00
committed by GitHub
parent be567af70d
commit 2a6cf8c8e7
261 changed files with 3178 additions and 3012 deletions
+34 -15
View File
@@ -191,24 +191,23 @@ std::string Strings::Escape(const std::string &s)
bool Strings::IsNumber(const std::string &s)
{
try {
auto r = stoi(s);
return true;
}
catch (std::exception &) {
return false;
for (char const &c: s) {
if (c == s[0] && s[0] == '-') {
continue;
}
if (std::isdigit(c) == 0) {
return false;
}
}
return true;
}
bool Strings::IsFloat(const std::string &s)
{
try {
auto r = stof(s);
return true;
}
catch (std::exception &) {
return false;
}
char* ptr;
strtof(s.c_str(), &ptr);
return (*ptr) == '\0';
}
std::string Strings::Join(const std::vector<std::string> &ar, const std::string &delim)
@@ -728,7 +727,7 @@ uint32 Strings::TimeToSeconds(std::string time_string)
time_unit.end()
);
auto unit = std::stoul(time_unit);
auto unit = Strings::ToUnsignedInt(time_unit);
uint32 duration = 0;
if (Strings::Contains(time_string, "s")) {
@@ -755,7 +754,7 @@ bool Strings::ToBool(std::string bool_string)
Strings::Contains(bool_string, "on") ||
Strings::Contains(bool_string, "enable") ||
Strings::Contains(bool_string, "enabled") ||
(Strings::IsNumber(bool_string) && std::stoi(bool_string))
(Strings::IsNumber(bool_string) && Strings::ToInt(bool_string))
) {
return true;
}
@@ -785,6 +784,26 @@ int Strings::ToInt(const std::string &s, int fallback)
return Strings::IsNumber(s) ? std::stoi(s) : fallback;
}
int64 Strings::ToBigInt(const std::string &s, int64 fallback)
{
return Strings::IsNumber(s) ? std::stoll(s) : fallback;
}
uint32 Strings::ToUnsignedInt(const std::string &s, uint32 fallback)
{
return Strings::IsNumber(s) ? std::stoul(s) : fallback;
}
uint64 Strings::ToUnsignedBigInt(const std::string &s, uint64 fallback)
{
return Strings::IsNumber(s) ? std::stoull(s) : fallback;
}
float Strings::ToFloat(const std::string &s, float fallback)
{
return Strings::IsFloat(s) ? std::stof(s) : fallback;
}
std::string Strings::RemoveNumbers(std::string s)
{
int current = 0;