题目链接
题目描述
问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
测试样例
样例1:
输入:
s = "1294512.12412"输出:'1,294,512.12412'
样例2:
输入:
s = "0000123456789.99"输出:'123,456,789.99'
样例3:
输入:
s = "987654321"输出:'987,654,321'
题目思路
首先,这是一道简单的模拟题,我尽量把每个步骤拆开,便于新手观看,
这个题,我们要处理几个细节:
-
整数和小数我们这里分开处理,便于理解。
// 分离整数和小数部分 string ZhengShu = "", XiaoShu = ""; bool f = true; for(int i = 0;i<s.size();i++) { if(s[i] == '.') f = false; else if(f) ZhengShu += s[i]; else XiaoShu += s[i]; } -
整数部分容易有前导零,要进行去除。
// 去除前导0 while(ZhengShu.size() && ZhengShu[0] == '0') ZhengShu.erase(0, 1);这个就很细节了,如果整数部分都是零,我们会保留一个零。
-
整数部分加逗号分割
// 整数部分每三位加一个逗号 for(int i = ZhengShu.size() - 3;i>=1;i-=3) { ZhengShu.insert(i, ","); } -
如果小数部分不存在,直接返回整数。
-
如果整数不存在,直接返回0.+小数
// 返回答案 if(ZhengShu.size() == 0) return ZhengShu + "." + XiaoShu; else if(XiaoShu.size() == 0) return ZhengShu; else return ZhengShu + "." + XiaoShu;
题解代码
话不多说,模拟题就应该直接上代码!!!
#include <bits/stdc++.h>
using namespace std;
std::string solution(const std::string& s) {
string ZhengShu = "", XiaoShu = "";
// 分离整数和小数部分
bool f = true;
for(int i = 0;i<s.size();i++) {
if(s[i] == '.') f = false;
else if(f) ZhengShu += s[i];
else XiaoShu += s[i];
}
// 去除前导0
while(ZhengShu.size() && ZhengShu[0] == '0') ZhengShu.erase(0, 1);
// 整数部分每三位加一个逗号
for(int i = ZhengShu.size() - 3;i>=1;i-=3) {
ZhengShu.insert(i, ",");
}
// 返回答案
if(ZhengShu.size() == 0) return "0." + XiaoShu;
else if(XiaoShu.size() == 0) return ZhengShu;
else return ZhengShu + "." + XiaoShu;
}
int main() {
std::cout << (solution("1294512.12412") == "1,294,512.12412") << std::endl;
std::cout << (solution("0000123456789.99") == "123,456,789.99") << std::endl;
std::cout << (solution("987654321") == "987,654,321") << std::endl;
}
反思
注意处理细节问题,尤其是最后的返回答案部分,一定要处理特殊情况