C语言/数据结构实现数字字符串千分位格式化(去除前导零+保留小数部分)
问题描述小M在工作时遇到了一个问题他需要将用户输入的数字字符串转换为带千分位逗号的格式。输入可能包含小数部分也可能不包含。处理规则如下去除前导零如果整数部分前面有无效的0比如000123需要去除这些前导零但注意不要去除小数点后的0小数部分的0需要保留千分位格式化整数部分从右向左每3位添加一个逗号第一个逗号前可能不足3位保留小数部分如果输入包含小数部分则原样保留所有小数位如果输入没有小数部分则输出也不包含小数部分注意输入保证是有效的数字字符串可能包含前导零也可能包含小数点。输入格式输入为一个字符串s表示需要格式化的数字输出格式返回格式化后的字符串约束条件输入字符串长度不超过 100输入保证是有效的数字格式可能包含前导零和小数点输入至少包含一个数字不会为空字符串输入不会包含千分位逗号或其他非数字字符除了可能的小数点程序代码#include stdio.h#include stdlib.h#include string.hchar* 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; }运行结果