一组字符串类型的数据(原型为整数<不超过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++甩了一两年了,甚感生疏,请求高手指导实现上述功能的高效格式化语句。
“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,抹掉最后的。
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.] // //