如何同时应用多种格式化方法,例如“1,234,567,890”和“12-3456-7890”到“1,2-34,56-7,890”
Posted
技术标签:
【中文标题】如何同时应用多种格式化方法,例如“1,234,567,890”和“12-3456-7890”到“1,2-34,56-7,890”【英文标题】:How to apply multiple formatting methods at the same time, e.g."1,234,567,890" and "12-3456-7890" to "1,2-34,56-7,890" 【发布时间】:2016-02-04 02:41:32 【问题描述】:例如,如果我想将“1234567890”转换为“1,234,567,890”,我可以使用:
#include <string>
#include <stdio.h>
using namespace std;
int main()
string st="1234567890";
for(int i=st.length()-3;i>0;st.insert(i,","),i-=3);
printf("%s\n",st.c_str());
return 0;
如果我想将“1234567890”转换为“12-3456-7890”,只需将 for 循环替换为:
for(int i=st.length()-4;i>0;st.insert(i,"-"),i-=4);
但问题是,它只能应用 1 种格式方法,而且这种格式方法是顺序的,如果我一起应用 2 个 for 循环,例如:
for(int i=st.length()-3;i>0;st.insert(i,","),i-=3);
for(int i=st.length()-4;i>0;st.insert(i,"-"),i-=4);
输出是 1-,234-,567-,890 但不是“1,2-34,56-7,890”,通用的方法是什么?
或者简单地说,我想要一个可以:
1. insert "," for every 3 characters
2. insert "-" for every 4 characters
3. insert ":" for every 7 characters
.
.
.
可以以通用方式添加插入条件,最简单的方法是什么?
【问题讨论】:
【参考方案1】:您可以只使用一个循环(减 1)和条件插入,而不是使用多个循环。例如:
string st="1234567890";
int originalLength = st.length();
for(int i=originalLength-1;i>0;i--)
int positionFromEnd = originalLength - i;
if (positionFromEnd % 3 == 0)
st.insert(i,",");
if (positionFromEnd % 4 == 0)
st.insert(i,"-");
if (positionFromEnd % 5 == 0)
st.insert(i,":");
// add more condition here as need be
printf("%s\n", st.c_str());
【讨论】:
【参考方案2】:如果你没问题,请忽略任何不是数字的内容,在每次传递中:
#include <string>
#include <stdio.h>
using namespace std;
void insert_delimeter(string& st, string delimeter, int interval)
for (int i = st.length() - 1, counter = 0; i > 0; i--)
if (st[i] >= '0' && st[i] <= '9')
++counter;
if (counter == interval)
st.insert(i,delimeter);
counter = 0;
int main()
string st = "1234567890";
insert_delimeter(st, ",", 3);
insert_delimeter(st, "-", 4);
printf("%s\n", st.c_str());
return 0;
结果是
1,2-34,56-7,890
【讨论】:
【参考方案3】:在第一个 for 循环中再添加一个计数器
int num=0;
for(int i=st.length()-3;i>0;st.insert(i,","),i-=3)
num++;
for(int i=st.length()-4 + num ;i>0;st.insert(i,"-"),i-=4)
num++;
这里发生的情况是每次插入时 num 都会增加,因此它有助于在下一次字符串更新中获得正确的字符串长度。您可以使用它来插入更多符号。
【讨论】:
以上是关于如何同时应用多种格式化方法,例如“1,234,567,890”和“12-3456-7890”到“1,2-34,56-7,890”的主要内容,如果未能解决你的问题,请参考以下文章