如何同时应用多种格式化方法,例如“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”的主要内容,如果未能解决你的问题,请参考以下文章

Java 数字格式验证

设计模式之桥接模式应用例题

设计模式之桥接模式应用例题

C#/VB.NET 在Excel单元格中应用多种字体格式

如何使用pFuzz以多种方法验证Web应用程序防火墙的安全性

LINUX右键打工方式,如何同时存在多种应用?