数字字符串格式化(易)

143 阅读4分钟

数字字符串格式化(易) 问题描述 小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'

以下是对该问题的详细分析:

一、问题理解

小 M 面临的任务是对用户输入的数字字符串进行处理。具体要求有两点:一是要将不带千分位逗号的数字字符串转换为带千分位逗号的规范格式;二是要去除输入字符串前面可能存在的无用的 0,同时还要保留小数部分的原有格式。

二、关键要素分析

  • 数字字符串输入:用户输入的是数字字符串形式,其可能存在多种情况,比如可能是整数形式、带有小数部分的形式,也可能前面带有无用的 0 等。
  • 千分位逗号添加:需要按照数字的位数规律,从右往左每三位添加一个千分位逗号,以提高数字的可读性。例如,数字 1234567 应转换为 1,234,567。
  • 无用 0 精简:对于输入字符串前面的无用 0(即不影响数字实际大小的 0),如 00123 应精简为 123,需要准确识别并去除,同时不能影响小数部分的 0(如果有的话),比如 0.00123 的小数部分 0 不能被去除。

三、解决思路

以下是一种可能的解决思路,可以使用编程语言(如 Python)来实现:

  1. 去除无用 0

    • 可以通过遍历输入的数字字符串,找到第一个非 0 字符的位置,然后截取从该位置开始到字符串末尾的部分,这样就去除了前面无用的 0。例如,对于字符串 "00123",找到第一个非 0 字符 "1" 的位置为 2,然后截取得到 "123"。
  2. 判断是否有小数部分

    • 检查去除无用 0 后的字符串中是否存在小数点。如果存在,则需要分别处理整数部分和小数部分;如果不存在,则只需要处理整数部分添加千分位逗号即可。
  3. 添加千分位逗号(整数部分)

    • 如果是只处理整数部分,可采用以下方法:

      • 先将整数部分字符串转换为整数类型(方便后续计算),然后再将其转换回字符串形式。例如,将 "123" 转换为整数 123,再转换回字符串形式仍为 "123"。
      • 接着从右往左遍历整数部分字符串,每三位插入一个千分位逗号。可以通过循环和字符串拼接的方式来实现。例如,对于整数 1234567,先转换为字符串 "1234567",然后从右往左每三位插入一个逗号,最终得到 "1,234,567"。
  4. 添加千分位逗号(小数部分)

    • 如果存在小数部分,先将整数部分和小数部分分开处理。

      • 对于整数部分,按照上述添加千分位逗号的方法进行处理。
      • 对于小数部分,保持其原有格式不变,然后将处理好的整数部分和小数部分重新拼接在一起,中间用小数点隔开。例如,对于数字字符串 "123.456",先处理整数部分得到 "1,234"(假设添加千分位逗号后),然后保持小数部分 "456" 不变,最后拼接得到 "1,234.456"。

Java代码

public class Main {

 public static String solution(String s) {
    // 去前头的零
    s = s.replaceFirst("^0+(?!$)","");
    // 分离整数和小数
    String [] parts = s.split("\\.");
    String intPart = parts[0];
    String decimalPart = parts.length > 1 ? "." + parts[1] : "";
    // 用 StringBuilder 来构建带千分位逗号地整数部分
    StringBuilder formattedIntPart = new StringBuilder();
    int len = intPart.length();
    for (int i = 0; i < len; i++) {
        if (i > 0 && (len - i) % 3 == 0) {
            // 在这里添加逗号
            formattedIntPart.append(",");
        }
        // 添加当前字符
        formattedIntPart.append(intPart.charAt(i));
    }

    // 合并整数和小数
    return formattedIntPart.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"));
}
}