问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的
0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
问题拆解
- 去除前导零:首先检查字符串的前导零,并将其去除。这可以通过将字符串转换为整数,然后将其转换回字符串来实现。
- 添加千分位逗号:将去除前导零后的数字字符串分割成整数部分和小数部分。对于整数部分,每三位添加一个千分位逗号。
- 格式化小数部分:如果原始数字字符串包含小数点,则将小数部分保留两位,并在末尾添加一个千分位逗号。
- 合并整数和小数部分:将整数部分和小数部分合并,形成最终的格式化字符串。
- 返回结果:将格式化后的字符串返回
代码
public class Main {
public static String solution(String s) {
StringBuilder str = new StringBuilder();
char[] ss = s.toCharArray();
int ze = 0;
for(char c : ss){
if (c == '0') {
ze++;
}else{
break;
}
}
int n = ss.length;
boolean f = false;
int count = 0;
for(int i = n - 1; i >= ze; i--){
if(!f && ss[i] != '.'){
str.append(ss[i]);
continue;
}
if (!f && ss[i] == '.') {
f = true;
str.append('.');
continue;
}
count++;
str.append(ss[i]);
if (count % 3 == 0 && i != ze) {
str.append(',');
}
}
StringBuilder str1 = new StringBuilder();
if (!f) {
int co = 0;
for(int i = n - 1; i >= ze; i--){
co++;
str1.append(ss[i]);
if(co %3 ==0 && i != ze){
str1.append(',');
}
}
return str1.reverse().toString();
}
// write code here
return str.reverse().toString();
}
public static void main(String[] args) {
System.out.println(solution("1294512.12412"));
System.out.println(solution("0000123456789.99"));
System.out.println(solution("987654321"));
}
}
#代码分析
-
字符串处理:
StringBuilder:这是一个可变的字符序列类,用于在原有字符串基础上进行修改和添加。它比String类更高效,尤其是在频繁修改字符串内容时。toCharArray():将字符串转换为字符数组,方便对每个字符进行遍历。StringBuilder.append():在字符序列的末尾追加字符。StringBuilder.reverse():将字符序列反转。StringBuilder.toString():将字符序列转换为字符串。
-
循环和条件判断:
for循环:用于遍历字符数组和字符串。if-else语句:用于判断字符是否为’0’,以及是否需要添加千分位逗号。break语句:用于跳出循环。continue语句:用于跳过当前循环的剩余代码,直接进入下一次循环。
-
整数和小数部分处理:
- 代码中通过检查字符串中的’.'字符来区分整数部分和小数部分。
- 对于整数部分,从后向前遍历字符数组,每三位添加一个千分位逗号。
- 对于小数部分,从后向前遍历字符数组,每三位添加一个千分位逗号,直到遇到’.'字符为止。
-
返回结果:
- 函数
solution返回格式化后的字符串。
- 函数