数字字符串格式化

74 阅读3分钟

问题描述

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

解题思路

  1. 去除前导零:首先需要去除字符串前面的无用零。
  2. 分割整数和小数部分:将字符串分割成整数部分和小数部分。
  3. 格式化整数部分:对整数部分进行千分位逗号的格式化。
  4. 拼接结果:将格式化后的整数部分和小数部分拼接起来。

代码提示

以下是一些代码提示,帮助你实现这个功能:

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

    }

}

关键步骤解释

  1. 去除前导零:使用 replaceFirst("^0+(?!$)", "") 来去除字符串前面的无用零。
  2. 分割整数和小数部分:使用 split("\.") 来分割字符串。
  3. 格式化整数部分:使用 StringBuilder 来构建格式化后的整数部分,每三位插入一个逗号。
  4. 拼接结果:将格式化后的整数部分和小数部分拼接起来。

详细解释

  1. 去除前导零

    java

    s = s.replaceFirst("^0

    +(?!$)", "");

    • ^0+:匹配字符串开头的连续零。
    • (?!$):这是一个负向前瞻,确保匹配的零不是字符串的末尾。
    • replaceFirst:只替换第一个匹配的子字符串。
  2. 分割整数和小数部分

    java

    String[] parts = s.

    split("\.");

    String integerPart = 

    parts[0];

    String decimalPart = 

    parts.length > 1 ? ".

    " + parts[1] : "";

    • split("\."):使用点号 . 分割字符串,点号在正则表达式中有特殊含义,所以需要转义。
    • parts[0]:整数部分。
    • parts.length > 1 ? "." + parts[1] : "":如果有小数部分,则拼接小数点和小数部分,否则为空字符串。
  3. 格式化整数部分

    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 中。
  4. 拼接结果

    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 方法并检查返回值是否与预期结果相等。