问题描述
小M在工作时遇到了一个问题,他需要将用户输入的数字字符串转换为带千分位逗号的格式。输入可能包含小数部分,也可能不包含。处理规则如下:
- 去除前导零:如果整数部分前面有无效的0(比如"000123"),需要去除这些前导零,但注意不要去除小数点后的0(小数部分的0需要保留)
- 千分位格式化:整数部分从右向左每3位添加一个逗号(第一个逗号前可能不足3位)
- 保留小数部分:如果输入包含小数部分,则原样保留所有小数位;如果输入没有小数部分,则输出也不包含小数部分
注意:输入保证是有效的数字字符串,可能包含前导零,也可能包含小数点。
输入格式
- 输入为一个字符串
s,表示需要格式化的数字
输出格式
- 返回格式化后的字符串
约束条件
- 输入字符串长度不超过 100
- 输入保证是有效的数字格式(可能包含前导零和小数点)
- 输入至少包含一个数字(不会为空字符串)
- 输入不会包含千分位逗号或其他非数字字符(除了可能的小数点)
程序代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* formatNumber(char* s) {
char* result = (char*)malloc(200 * sizeof(char));
char integer[100], decimal[100];
integer[0] = '\0';
decimal[0] = '\0';
// 分离整数部分和小数部分
char* dot = strchr(s, '.');
if (dot != NULL) {
strncpy(integer, s, dot - s);
integer[dot - s] = '\0';
strcpy(decimal, dot + 1);
} else {
strcpy(integer, s);
}
// 去除整数部分的前导零
int start = 0;
while (integer[start] == '0' && integer[start + 1] != '\0') {
start++;
}
// 千分位格式化整数部分
char formatted[100] = "";
int len = strlen(integer + start);
int firstGroup = len % 3;
if (firstGroup == 0) firstGroup = 3;
int idx = start;
// 第一组
strncat(formatted, integer + idx, firstGroup);
idx += firstGroup;
// 后续每3位一组
while (idx < start + len) {
strcat(formatted, ",");
strncat(formatted, integer + idx, 3);
idx += 3;
}
// 拼接结果
if (dot != NULL) {
sprintf(result, "%s.%s", formatted, decimal);
} else {
sprintf(result, "%s", formatted);
}
return result;
}
int main() {
printf("%s\n", formatNumber("1294512.12412"));
printf("%s\n", formatNumber("0000123456789.99"));
printf("%s\n", formatNumber("987654321"));
printf("%s\n", formatNumber("0000.1200"));
printf("%s\n", formatNumber("1234"));
return 0;
}
#include <stdio.h> #include <stdlib.h> #include <string.h> char* formatNumber(char* s) { char* result = (char*)malloc(200 * sizeof(char)); char integer[100], decimal[100]; integer[0] = '\0'; decimal[0] = '\0'; // 分离整数部分和小数部分 char* dot = strchr(s, '.'); if (dot != NULL) { strncpy(integer, s, dot - s); integer[dot - s] = '\0'; strcpy(decimal, dot + 1); } else { strcpy(integer, s); } // 去除整数部分的前导零 int start = 0; while (integer[start] == '0' && integer[start + 1] != '\0') { start++; } // 千分位格式化整数部分 char formatted[100] = ""; int len = strlen(integer + start); int firstGroup = len % 3; if (firstGroup == 0) firstGroup = 3; int idx = start; // 第一组 strncat(formatted, integer + idx, firstGroup); idx += firstGroup; // 后续每3位一组 while (idx < start + len) { strcat(formatted, ","); strncat(formatted, integer + idx, 3); idx += 3; } // 拼接结果 if (dot != NULL) { sprintf(result, "%s.%s", formatted, decimal); } else { sprintf(result, "%s", formatted); } return result; } int main() { printf("%s\n", formatNumber("1294512.12412")); printf("%s\n", formatNumber("0000123456789.99")); printf("%s\n", formatNumber("987654321")); printf("%s\n", formatNumber("0000.1200")); printf("%s\n", formatNumber("1234")); return 0; }