Удалите конечные 0 и десятичные, если необходимо, из строки

Я пытаюсь удалить конечные нули из десятичной дроби, удаляя десятичную дробь, если больше нет конечных нулей.

Эта строка производится из буста gmp_float строковый вывод исправлен.

Это моя попытка, но я получаю std::out_of_range:

string trim_decimal( string toFormat ){
while( toFormat.find(".") && toFormat.substr( toFormat.length() - 1, 1) == "0" || toFormat.substr( toFormat.length() - 1, 1) == "." ){
toFormat.pop_back();
}
return toFormat;
}

Как я могу удалить трейлинг 0s, если присутствует десятичная дробь, удаление десятичной дроби, если больше нет 0после десятичной запятой?

1

Решение

Вам нужно изменить это на:

while( toFormat.find(".")!=string::npos   // !=string::npos is important!!!
&& toFormat.substr( toFormat.length() - 1, 1) == "0"|| toFormat.substr( toFormat.length() - 1, 1) == "." )
{
toFormat.pop_back();
}

Ключ здесь, чтобы добавить !=string::npos. Когда не найден, std::basic_string::find() вернусь std::basic_string::npos, который не равен false (не то, что вы ожидаете).

static const size_type npos = -1;
2

Другие решения

    auto lastNotZeroPosition = stringValue.find_last_not_of('0');
if (lastNotZeroPosition != std::string::npos && lastNotZeroPosition + 1 < stringValue.size())
{
//We leave 123 from 123.0000 or 123.3 from 123.300
if (stringValue.at(lastNotZeroPosition) == '.')
{
--lastNotZeroPosition;
}
stringValue.erase(lastNotZeroPosition + 1, std::string::npos);
}

В C ++ у вас есть станд :: строка :: find_last_not_of

0

По вопросам рекламы [email protected]