Добрый день,
Не знаю, есть ли у вас фиксированное количество цифр для itemnumber
, но я собираюсь предположить, что вы этого не сделаете.
Этопростой подход;Сначала вы должны отделить слова вашей строки.Например, используйте std::istringstream
.
Когда вы разбили строку на слова, например, передав ее итераторы к вектору или прочитав ее с помощью operator>>
, вы начинаете проверять первое слово в обратном направлении.до тех пор, пока вы не найдете что-нибудь , то есть , а не один из "0123456789 "
(обратите внимание на пробел в конце) .После того, как вы это сделаете, вы получите итератор о том, где заканчиваются эти цифры (назад), и обрежете исходную строку или, если у вас есть возможность, уже разбитую строку.Вуаля!У вас есть имя и номер элемента.
Для записи, я собираюсь сделать все это, используя ту же технику и для процентной разметки, конечно, за исключением символов "% "
.
#define VALID_DIGITS "0123456789 "
#define VALID_PERCENTAGE "% "
struct ItemData {
std::string Name;
int Count;
double Price;
double PercentMarkup;
};
int ExtractItemData(std::string Line, ItemData & Output) {
std::istringstream Stream( Line );
std::vector<std::string> Words( Stream.begin(), Stream.end() );
if (Words.size() < 3) {
/* somebody gave us a malformed line with less than needed words */
return -1;
}
// Search from backwards, until you do not find anything that is not digits (0-9) or a whitespace
std::size_t StartOfDigits = Words[0].find_last_not_of( VALID_DIGITS );
if (StartOfDigits == std::string::npos) {
/* error; your item name is invalid */
return -2;
}
else {
// Separate the string into 2 parts
Output.Name = Words[0].substr(0, StartOfDigits); // Get the first part
Output.Count = std::stoi( Words[0].substr(StartOfDigits, Words[0].length() - StartOfDigits) );
Output.Price = std::stod( Words[1] );
// Search from backwards, until we do not find anything that is not '%' or ' '
std::size_t StartOfPercent = Words[2].find_last_not_of(VALID_PERCENTAGE);
Output.PercentMarkup = std::stod( Words[2].substr(0, StartOfPercent) );
}
return 0;
}
Запросы кода включают sstream
, vector
, string
и cstdint
, если вы не определили size_t
Надеемся на ответбыло полезно.Желаем удачи, COlda.
PS .: Мой первый ответ о переполнении стека ^^;