数字字符格式化|豆包MarsCode AI刷题
题目理解
题目要求将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。此外,输入的数字字符串前面可能会有无用的 0,这些也需要精简掉。
思路分析
- 去除前导零:首先,我们需要去除字符串前面的无用零。可以使用正则表达式
^0+(?!$)来实现这一点。 - 分离整数和小数部分:接下来,我们需要将字符串分成整数部分和小数部分。可以使用
String.split("\.")来实现这一点。 - 格式化整数部分:对于整数部分,我们需要从右到左每三位插入一个逗号。可以使用
StringBuilder来构建这个格式化的字符串。 - 合并整数和小数部分:最后,将格式化后的整数部分和小数部分合并成最终的结果。
图解
输入: "0000123456789.99" 去除前导零: "123456789.99" 分离整数和小数部分: ["123456789", "99"] 格式化整数部分: "123,456,789" 合并整数和小数部分: "123,456,789.99" 输出: "123,456,789.99"
代码详解
public class Main { public static String solution(String s) { // 去除前导零 s = s.replaceFirst("^0+(?!$)", "");
// 分离整数和小数部分
String[] parts = s.split("\\.");
String integerPart = parts[0];
String decimalPart = parts.length > 1 ? "." + parts[1] : "";
// 格式化整数部分
StringBuilder formattedInteger = new StringBuilder();
int len = integerPart.length();
for (int i = 0; i < len; i++) {
if (i > 0 && i % 3 == 0) {
formattedInteger.append(",");
}
formattedInteger.append(integerPart.charAt(len - 1 - i));
}
formattedInteger.reverse();
// 合并整数和小数部分
return formattedInteger.toString() + decimalPart;
}
public static void main(String[] args) {
System.out.println(solution("1294512.12412").equals("1,294,512.12412")); // true
System.out.println(solution("0000123456789.99").equals("123,456,789.99")); // true
System.out.println(solution("987654321").equals("987,654,321")); // true
}
}
知识点总结
- 正则表达式:
^0+(?!$)用于去除字符串前面的所有零。 - 字符串操作:
String.split("\.")用于将字符串按小数点分割成整数部分和小数部分。 - StringBuilder:用于高效地构建和操作字符串,特别是在需要频繁修改字符串内容时。
- 循环与条件判断:通过循环和条件判断来实现从右到左每三位插入一个逗号。
分析与理解
- 去除前导零:使用正则表达式
^0+(?!$)可以高效地去除字符串前面的所有零。这个正则表达式的含义是匹配字符串开头的零,但不包括字符串末尾的零。 - 分离整数和小数部分:使用
String.split("\.")可以将字符串按小数点分割成整数部分和小数部分。这个方法返回一个字符串数组,数组的第一个元素是整数部分,第二个元素是小数部分(如果有)。 - 格式化整数部分:使用
StringBuilder从右到左每三位插入一个逗号,然后反转字符串得到正确的格式。这种方法避免了使用复杂的字符串拼接操作,提高了效率。 - 合并整数和小数部分:将格式化后的整数部分和小数部分合并成最终的结果。这个步骤很简单,只需要将两个字符串拼接在一起即可。
学习建议
- 掌握正则表达式:正则表达式是处理字符串的强大工具,建议多练习和使用,掌握常见的正则表达式模式。
- 熟悉字符串操作:字符串操作是编程中非常常见的任务,建议多练习字符串的分割、拼接、替换等操作。
- 理解StringBuilder:
StringBuilder在处理需要频繁修改的字符串时比String更高效,建议多使用和理解其工作原理。 - 练习算法思维:通过解决这类问题,可以锻炼算法思维和逻辑推理能力,建议多做类似的练习题。
总结
通过这个题目,我们学习了如何使用正则表达式去除前导零,如何使用 StringBuilder 高效地构建和操作字符串,以及如何通过循环和条件判断来实现特定的字符串格式化需求。这些知识点和技巧在实际编程中非常有用,建议多加练习和应用。