题目
数字字符串格式化
问题描述
小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'
思路解析
1.注意到题目中的字符串可能存在小数点,可以设一个dot的变量,初始化-1,代表没有小数点,从字符串的尾开始遍历,遍历到有","字符,用dot记录
2.字符串前可能有无效的0,可以从字符串头开始遍历,直至不为0,剪切掉前面的0
3.如果dot不为-1(存在小数点),从dot-1开始遍历,若dot为-1,则从字符串尾开始遍历,设置一个count,起始为0,每遍历一个字符+1,count为3时,将","插入字符串中,并将count重新设为0,直至循环结束。
4.关于将","插入字符串的操作,使用string库中的substr方法切割字符串,设置一个头字符串front为","前面的字符串,再设置一个尾字符串rear为","后面的字符串,更新字符串为front + "," + rear
substr
定义
substr是string类(std::string)的一个成员函数,用于从一个字符串中提取子字符串。它返回一个新的字符串,该字符串是原始字符串的一部分。
函数原型及参数含义
- 函数原型通常为
string substr (size_t pos = 0, size_t len = npos); - pos 参数:表示子字符串在原始字符串中的起始位置。这个位置是从 0 开始计数的,即第一个字符的位置是 0。例如,对于字符串
"Hello World",如果pos = 6,那么子字符串将从字符'W'开始提取。 - len 参数:表示要提取的子字符串的长度。如果不指定这个参数或者指定为
npos(npos是string类中的一个静态常量,表示 “直到字符串末尾”),那么将从起始位置pos开始一直提取到原始字符串的末尾。例如,对于字符串"abcdef",如果pos = 1且len = 3,那么提取出来的子字符串是"bcd"。
C++代码
#include <iostream>
#include <string>
using namespace std;
string solution(string s)
{
int dot = -1; //用于记录小数点的位置
for(int i=0;i<s.length();i++)
{
if(s[i]=='0') continue; //如果前面为字符'0'则继续遍历
else
{
s = s.substr(i); //一旦不为'0',剪切字符串s
break; //跳出循环
}
}
for(int i=s.length()-1;i>=0;i--)
{
if(s[i]=='.') //如果存在小数点,dot记录位置
{
dot = i;
break;
}
}
int start = -1; //用于记录循环插入','的开端
if(dot!=-1) start = dot-1; //如果dot存在,则从dot的上一位开始
else start = s.length()-1; //否则从尾开始
int count = 0; //用于记录位数
for(int i=start;i>=0;i--)
{
if(count==3) //count等于3,开始插入','
{
count=0;
string rear = s.substr(i+1);
string front = s.substr(0,i+1);
s = front + "," + rear;
}
count++;
}
return s; //返回结果
}
int main()
{
cout << (solution("1294512.12412") == "1,294,512.12412") << std::endl;
cout << (solution("0000123456789.99") == "123,456,789.99") << std::endl;
cout << (solution("987654321") == "987,654,321") << std::endl;
return 0;
}