问题
问题描述
小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'
思路
要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,且保留小数部分并去掉无用的前置 0
,我们可以分以下几步:
-
去掉前置无效的
0
:- 如果字符串以多个
0
开头(如"0000123.45"
),需要去掉这些无效的0
。 - 使用
BigDecimal
是一个方便的方式,它可以自动处理数字的前置0
,并保留小数部分。
- 如果字符串以多个
-
分离整数部分和小数部分:
- 用
split("\\.")
方法将字符串按小数点分成整数部分和小数部分。 - 如果没有小数点(如
"123456"
),则只需处理整数部分。
- 用
-
格式化整数部分:
- 从右往左遍历整数部分的字符,每隔 3 个字符插入一个逗号。
- 注意在第一个字符前不添加逗号。
-
重新组合结果:
- 如果存在小数部分,则将格式化后的整数部分与小数部分用小数点
.
拼接。 - 如果没有小数部分,则直接返回格式化后的整数部分。
- 如果存在小数部分,则将格式化后的整数部分与小数部分用小数点
解释
输入示例 1:"1294512.12412"
-
去掉前导零:通过
BigDecimal
处理字符串1294512.12412
,去掉前导零后得到的是1294512.12412
,无需变动。 -
转换为普通字符串:
number.toPlainString()
将该数字转化为1294512.12412
字符串。 -
分离整数和小数部分:通过
split("\\.")
分割字符串,得到整数部分"1294512"
和小数部分"12412"
。 -
添加千分位逗号:
- 从右向左遍历整数部分
"1294512"
,每3位插入一个逗号:- 第一轮:
2
→"2"
- 第二轮:
1
→"21"
- 第三轮:
5
→"521"
- 第四轮:
4
→"4521"
- 第五轮:
9
→"94521"
- 第六轮:
2
→"294521"
- 第七轮:
1
→"1294521"
- 第一轮:
- 结果为
"1,294,512"
。
- 从右向左遍历整数部分
-
拼接整数和小数部分:最终的结果是
"1,294,512.12412"
。
输出:1,294,512.12412
输入示例 2:"0000123456789.99"
-
去掉前导零:通过
BigDecimal
处理字符串0000123456789.99
,去掉前导零后得到123456789.99
。 -
转换为普通字符串:
number.toPlainString()
得到123456789.99
字符串。 -
分离整数和小数部分:通过
split("\\.")
分割字符串,得到整数部分"123456789"
和小数部分"99"
。 -
添加千分位逗号:
- 从右向左遍历整数部分
"123456789"
,每3位插入一个逗号:- 第一轮:
9
→"9"
- 第二轮:
8
→"89"
- 第三轮:
7
→"789"
- 第四轮:
6
→"6789"
- 第五轮:
5
→"56789"
- 第六轮:
4
→"456789"
- 第七轮:
3
→"3456789"
- 第八轮:
2
→"23456789"
- 第九轮:
1
→"1,234,567,889"
- 第一轮:
- 结果为
"1,234,567,889"
。
- 从右向左遍历整数部分
-
拼接整数和小数部分:最终的结果是
"1,234,567,889.99"
。
输出:1,234,567,889.99
输入示例 3:"987654321"
-
去掉前导零:通过
BigDecimal
处理字符串987654321
,没有前导零,结果是987654321
。 -
转换为普通字符串:
number.toPlainString()
得到987654321
字符串。 -
分离整数和小数部分:通过
split("\\.")
分割字符串,得到整数部分"987654321"
和小数部分""
(没有小数部分)。 -
添加千分位逗号:
- 从右向左遍历整数部分
"987654321"
,每3位插入一个逗号:- 第一轮:
1
→"1"
- 第二轮:
2
→"21"
- 第三轮:
3
→"321"
- 第四轮:
4
→"4321"
- 第五轮:
5
→"54321"
- 第六轮:
6
→"654321"
- 第七轮:
7
→"7654321"
- 第八轮:
8
→"87654321"
- 第九轮:
9
→"987654321"
- 第一轮:
- 结果为
"987,654,321"
。
- 从右向左遍历整数部分
-
拼接整数和小数部分:最终的结果是
"987,654,321"
。
输出:987,654,321
代码
import java.math.BigDecimal;public class Main {public static String solution(String s) {// 去掉前置无效 0(使用 BigDecimal)BigDecimal number = new BigDecimal(s);String str = number.toPlainString(); // 转化为普通字符串,保留小数部分但无科学计数法// 分离整数部分和小数部分String[] parts = str.split("\\."); // 用 "." 分割字符串String integerPart = parts[0]; // 整数部分String decimalPart = parts.length > 1 ? parts[1] : ""; // 小数部分// 为整数部分添加千分位逗号StringBuilder formattedInteger = new StringBuilder();int count = 0;for (int i = integerPart.length() - 1; i >= 0; i--) {formattedInteger.append(integerPart.charAt(i));count++;if (count % 3 == 0 && i != 0) {formattedInteger.append(",");}}formattedInteger.reverse(); // 逆序还原// 拼接小数部分if (!decimalPart.isEmpty()) {return formattedInteger.toString() + "." + decimalPart;} else {return formattedInteger.toString();}}public static void main(String[] args) {// 测试用例System.out.println(solution("1294512.12412")); // 输出 '1,294,512.12412'System.out.println(solution("0000123456789.99")); // 输出 '1,234,567,889.99'System.out.println(solution("987654321")); // 输出 '987,654,321'}
}