在一个遥远的国家,银行为了更快更好的处理用户的订单,决定将一整串的数字按照一定的规则分隔开来,分隔规则如下:
1、实数的整数部分按照每三个数字用逗号分隔开(整数部分的高位有多余的0时,需先将多余的0过滤后,再进行数字分隔,如:0001234567 输出结果为1,234,567.00)
2、小数部分保留两位小数(四舍五入)
3、如果该数是负的,则在输出时需用括号将分隔后的数字括起来,例如:-10005.1645的输出结果为(10,005.16)
00012345670.0000-10005.1645
1,234,567.000.00(10,005.16)
#include <stdio.h>
#include <string.h>
#define maxn 110
char buf[maxn];
int main() {
int sign, left, dot, i, len;
char *ch;
while(scanf("%s", buf + 1) != EOF) {
sign = 0;
buf[0] = '0';
if(buf[1] == '-') {
sign = 1;
buf[1] = '0';
}
len = strlen(buf);
if(ch = strchr(buf, '.')) {
dot = ch - buf;
} else dot = len;
// 以下处理进位
if(len - dot > 3) {
if(buf[dot+3] > '4') {
if(++buf[dot+2] > '9') {
buf[dot+2] = '0';
if(++buf[dot+1] > '9') {
buf[dot+1] = '0';
++buf[dot-1];
}
}
i = dot - 1;
while(buf[i] > '9') {
buf[i--] = '0';
++buf[i];
}
}
buf[dot+3] = '\0';
} else if(len - dot == 2) {
buf[len++] = '0';
buf[len] = '\0';
} else if(len - dot == 1) {
buf[len++] = '0';
buf[len++] = '0';
buf[len] = '\0';
} else if(len - dot == 0) {
buf[len++] = '.';
buf[len++] = '0';
buf[len++] = '0';
buf[len] = '\0';
}
// printf("%s...\n", buf);
// 以下去前导零
for(left = 0; buf[left] == '0'; ++left)
;
// 输出整数部分
if(buf[left] == '.') --left;
if(sign) putchar('(');
while(left < dot) {
putchar(buf[left++]);
if(left != dot && (dot - left) % 3 == 0)
putchar(',');
}
// 输出小数部分
printf("%s", buf + dot);
if(sign) putchar(')');
putchar('\n');
}
return 0;
}原文:http://blog.csdn.net/chang_mu/article/details/40837753