所有人都好,
我很难尝试从字符串中提取所需的整数。我得到以下内容可以从文件中读取:
商品名称商品编号价格百分比标记
示例
礼服-u2285 24.22 37%
TwoB1Ask1-m1275 90.4 1%
我一直想做的是将商品编号与商品名称分开,以便我可以将商品编号存储为排序参考。如您所见,第一个示例itemnameitemnumber是一个清晰的字符到数字的分隔符,而下一个示例在其项目名称中包含数字。
我尝试了几种不同的方法,但是事实证明,某些商品名称的名称之间使用整数分开,这超出了我的经验。
如果有人可以帮助我,我将不胜感激他们的时间和知识。
答案 0 :(得分:1)
美好的一天,
我不知道,itemnumber
的位数是否固定,但我将假定您没有。
这是一种简单的方法;首先,您必须将一行中的单词分开。例如,使用std::istringstream
。
当您将行拆分为多个单词时,例如通过将其迭代器赋予向量,或使用operator>>
进行读取,您便开始从后往上检查第一个单词,直到找到任何内容< / em> 不是"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;
}
如果未定义size_t,则代码要求包括sstream
,vector
,string
和cstdint
希望答案很有用。
祝你好运,Colda。
PS .:我对堆栈溢出的第一个回答^^;
答案 1 :(得分:-1)
您可以迭代将数字推入向量的字符串,然后使用stringstream将其转换为整数