问题描述
小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'解题思路
- 去除前导零:首先需要去除字符串前面的无用零。
- 分割整数和小数部分:将字符串分割成整数部分和小数部分。
- 格式化整数部分:对整数部分进行千分位逗号的格式化。
- 拼接结果:将格式化后的整数部分和小数部分拼接起来。
代码提示
以下是一些代码提示,帮助你实现这个功能:
java
public class Main {
public static
String solution
(String s) {
// 1. 去除前导
零
s = s.
replaceFirst
("^0+(?!$)",
"");
// 2. 分割整数
和小数部分
String[]
parts = s.
split("\.");
String
integerPart =
parts[0];
String
decimalPart =
parts.length
> 1 ? "." +
parts[1] : "";
// 3. 格式化整
数部分
StringBuilder
formattedInteg
erPart = new
StringBuilder
();
for (int i =
0; i <
integerPart.
length(); i
++) {
if (i >
0 &&
(integerPa
rt.length
() - i) %
3 == 0) {
format
tedInt
egerPa
rt.
append
(",");
}
formattedI
ntegerPart
.append
(integerPa
rt.charAt
(i));
}
// 4. 拼接结果
return
formattedInteg
erPart.
toString() +
decimalPart;
}
public static
void main(String
[] args) {
System.out.
println
(solution
("1294512.
12412").equals
("1,294,512.
12412"));
System.out.
println
(solution
("000012345678
9.99").equals
("123,456,789.
99"));
System.out.
println
(solution
("987654321").
equals("987,
654,321"));
}
}
关键步骤解释
- 去除前导零:使用
replaceFirst("^0+(?!$)", "")来去除字符串前面的无用零。 - 分割整数和小数部分:使用
split("\.")来分割字符串。 - 格式化整数部分:使用
StringBuilder来构建格式化后的整数部分,每三位插入一个逗号。 - 拼接结果:将格式化后的整数部分和小数部分拼接起来。
详细解释
-
去除前导零
java
s = s.replaceFirst("^0
+(?!$)", "");
^0+:匹配字符串开头的连续零。(?!$):这是一个负向前瞻,确保匹配的零不是字符串的末尾。replaceFirst:只替换第一个匹配的子字符串。
-
分割整数和小数部分
java
String[] parts = s.
split("\.");
String integerPart =
parts[0];
String decimalPart =
parts.length > 1 ? ".
" + parts[1] : "";
split("\."):使用点号.分割字符串,点号在正则表达式中有特殊含义,所以需要转义。parts[0]:整数部分。parts.length > 1 ? "." + parts[1] : "":如果有小数部分,则拼接小数点和小数部分,否则为空字符串。
-
格式化整数部分
java
StringBuilder
formattedIntegerPart
= new StringBuilder();
for (int i = 0; i <
integerPart.length();
i++) {
if (i > 0 &&
(integerPart.
length() - i) % 3
== 0) {
formattedInteg
erPart.append
(",");
}
formattedIntegerPa
rt.append
(integerPart.
charAt(i));
}
StringBuilder:用于高效地构建字符串。for (int i = 0; i < integerPart.length(); i++):遍历整数部分的每一个字符。if (i > 0 && (integerPart.length() - i) % 3 == 0):每三位插入一个逗号,i > 0确保第一个字符前不插入逗号。formattedIntegerPart.append(integerPart.charAt(i)):将当前字符追加到StringBuilder中。
-
拼接结果
java
return
formattedIntegerPart.
toString() +
decimalPart;
formattedIntegerPart.toString():将StringBuilder转换为字符串。+ decimalPart:拼接格式化后的整数部分和小数部分。
测试部分
java
public static void
main(String[] args) {
System.out.println
(solution
("1294512.12412").
equals("1,294,512.
12412"));
System.out.println
(solution
("0000123456789.
99").equals("123,
456,789.99"));
System.out.println
(solution
("987654321").
equals("987,654,
321"));
}
- 调用
solution方法并检查返回值是否与预期结果相等。