一组字符串类型的数据(原型为整数<不超过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.]
//
//