MarsCode 刷题之数字字符串格式化

204 阅读2分钟

Snip20241115_3.png

一、问题描述

小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'

二、具体实现代码

public class Main {
    public static String solution(String s) {
       //去除0
      s = s.replaceFirst("^0+(?!$)","");
      
      //分离
      String[] parts = s.split("\\.");
      String integerPart  = parts[0];
      String decimalPart = parts.length > 1 ? "." + parts[1] : "";

      //处理整数部分,插入千分位逗号
      StringBuffer sb = new StringBuffer();
      int len = integerPart.length();
      for (int i = 0; i < len; i++) {
        if (i > 0 && (len - i) % 3 == 0) {
            sb.append(",");
        }
        sb.append(integerPart.charAt(i));
      }

        return sb.toString() + decimalPart;
    }

    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"));
    }
}

###三、核心实现部分解释

  1. 去除前导零
s = s.replaceFirst("^0+(?!$)", "");

解释:使用正则表达式 ^0+(?!$) 去除字符串 s 前面的无效 0^0+ 匹配字符串开头的 0(?!$) 确保不匹配空字符串。

2.分离整数部分和小数部分

String[] parts = s.split("\\.");
String integerPart = parts[0];
String decimalPart = parts.length > 1 ? "." + parts[1] : "";

解释:使用 split("\.") 方法将字符串 s 按小数点 . 分割成两部分,存储在数组 parts 中。parts[0] 是整数部分,parts[1] 是小数部分。如果 parts 数组的长度大于 1,则将小数点 . 和 parts[1] 拼接成 decimalPart,否则 decimalPart 为空字符串。

2.处理整数部分,插入千分位逗号

StringBuffer sb = new StringBuffer();
int len = integerPart.length();
for (int i = 0; i < len; i++) {
    if (i > 0 && (len - i) % 3 == 0) {
        sb.append(",");
    }
    sb.append(integerPart.charAt(i));
}

解释

-   创建一个 `StringBuffer` 对象 `sb`,用于构建最终的字符串。

-   获取整数部分 `integerPart` 的长度,并赋值给 `len`-   使用 `for` 循环遍历整数部分的每一个字符。

-   如果当前字符不是第一个字符,并且从当前字符到字符串末尾的长度是 3 的倍数,则插入一个逗号 `,`-   将当前字符追加到 `StringBuffer` 对象 `sb` 中。

4.合并结果

return sb.toString() + decimalPart;

解释:将 StringBuffer 对象 sb 转换为字符串,并拼接上小数部分 decimalPart,然后返回结果。

四、总结

这段代码的核心实现部分主要包括以下几个步骤:

  1. 去除前导零:使用正则表达式去除字符串前面的无效 0
  2. 分离整数部分和小数部分:使用 split 方法将字符串按小数点分割成整数部分和小数部分。
  3. 处理整数部分,插入千分位逗号:使用 StringBuffer 对象逐字符处理整数部分,并在适当位置插入逗号。
  4. 合并结果:将处理后的整数部分和小数部分重新合并成一个字符串并返回。

通过这些步骤,代码成功地将一个不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留了小数部分。