求一个格式化字符串的好算法

C++语言 码拜 8年前 (2016-06-07) 1369次浏览
一组字符串类型的数据(原型为整数<不超过5位>、实数<实数的整数部分不会超过5位>):
“0”
“17”
“20.1”
“22.234”
“2341.345”
“12345.345”
要求将其转换为统一的6位字符串:
“00000.”
“00017.”
“0020.1”
“022.23”
“2341.3”
“12345.”
即:
1、没有小数点的(整数)在末尾补小数点
2、实数类型的小数部分最多留两位,末尾不能出现0,即“020.10”
3、长度不足6位的前面补0
4、长度超过6位的从左向右截取。
记得sprint函数的格式化功能很强大,可感觉要实现上述功能需要写一堆语句。
原因是C++甩了一两年了,甚感生疏,请求高手指导实现上述功能的高效格式化语句。
解决方案

10

纯字符串,假如中间不转为数值的方法:
1.查找“.”的位置;
2.假如没有点,在末尾加上点;
3.假如有点,将点后两位之后的字符清理掉;
4.判断字符串长度,不足6的时候,在前面加‘0‘’补足,假如末尾是0,则抹掉,并在前面加上;
中间转换成数值的做法:
1.sscanf 将字符串转为整形,和浮点型,两个值
2.用浮点型减去整形,保留这个结果;
3.sprintf(),输出5位补0整形,加点,两位第2步的结果
4.假如这个字符串,最后是0,抹掉最后的0,在前面补。
5.假如最前面不是0,长度又超过6,抹掉最后的。

20

20

求一个格式化字符串的好算法这个世界上最大的差别和最远的距离都存在于“说”和“做”之间。

//一组字符串类型的数据(原型为整数<不超过5位>、实数<实数的整数部分不会超过5位>):
//0
//17
//20.1
//22.234
//2341.345
//12345.345
//要求将其转换为统一的6位字符串:
//00000.
//00017.
//0020.1
//022.23
//2341.3
//12345.
//即:
//1、没有小数点的(整数)在末尾补小数点
//2、实数类型的小数部分最多留两位,末尾不能出现0,即020.10
//3、长度不足6位的前面补0
//4、长度超过6位的从左向右截取。
#include <stdio.h>
#include <string.h>
char s[30];
char t[30];
char *p;
int i,L;
int main() {
    while (1) {
        fgets(s,30,stdin);
        if ("\n"==s[strlen(s)-1]) s[strlen(s)-1]=0;
        if (0==s[0]) break;
        L=strlen(s);
        p=strchr(s,".");
        if (NULL==p) {
            s[L]=".";s[L+1]=0;
            p=s+L;
            L++;
        }
        for (i=L-1;i>=0;i--) if (s[i]=="0" || i>p-s+2) s[i]=0; else break;
        s[6]=0;
        sprintf(t,"%06s",s);
        printf("[%s]\n",t);
    }
    return 0;
}
//0
//[00000.]
//17
//[00017.]
//20.1
//[0020.1]
//22.234
//[022.23]
//2341.345
//[2341.3]
//12345.345
//[12345.]
//
//

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求一个格式化字符串的好算法
喜欢 (0)
[1034331897@qq.com]
分享 (0)