数字字符串格式化

问题描述

小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. 首先去掉字符串前面的无用的 0,可以使用 trimStart("0") 方法。
  2. 将字符串按照小数点进行分割,得到整数部分和小数部分。
  3. 将整数部分按照每三位进行分割,并在分割后的部分之间添加逗号。
  4. 将整数部分和小数部分拼接起来,得到最终的结果。

代码实现

Cangjie

RuneArray

func solution(s: String) {
    let strArray = s.trimStart("0").split(".")
    let integer_part = strArray[0]
    var fractional_part = ""
    if (strArray.size > 1) {
        fractional_part = strArray[1]
    }
    var result = ""
    let rs = integer_part.toRuneArray()
    let product = rs.size / 3
    let surplus = rs.size % 3
    if( surplus != 0) {result = "${String(rs[..surplus])},"}
    for (i in 0..product - 1) {
        result += "${String(rs.slice(surplus + 3 * i, 3))},"
    }
    result += "${String(rs[rs.size - 3..])}"
    if (fractional_part != "") {result = "${result}.${fractional_part}"}
    result
}

main() {
    println(solution("1294512.12412") == '1,294,512.12412')
    println(solution("0000123456789.99") == '123,456,789.99')
    println(solution("987654321") == '987,654,321')
}

Iterator

import std.collection.*

func solution(s: String) {
    let strArray = s.trimStart("0").split(".")
    let integer_part = strArray[0]
    var fractional_part = ""
    if (strArray.size > 1) {
        fractional_part = strArray[1]
    }
    var result = ""
    let rs = integer_part.toRuneArray()
    let product = rs.size / 3
    let surplus = rs.size % 3
    //  The same as above...
    let it = rs.iterator()
    let takeString = {n => String(n |> it.take |> collectArray)}
    if (surplus != 0) { result = "${takeString(surplus)},"}
    for (_ in 0..product - 1) { result += "${takeString(3)},"}
    result += "${takeString(3)}"
    //  The same as above...
    if (fractional_part != "") {result = "${result}.${fractional_part}"}
    result
}

main() {
    println(solution("1294512.12412") == '1,294,512.12412')
    println(solution("0000123456789.99") == '123,456,789.99')
    println(solution("987654321") == '987,654,321')
}

ArrayList

import std.collection.*

func solution(s: String) {
    let strArray = s.trimStart("0").split(".")
    let integer_part = strArray[0]
    var fractional_part = ""
    if (strArray.size > 1) {
        fractional_part = strArray[1]
    }
    // The same as above...
    var result = ''
    var list = ArrayList(integer_part.toRuneArray())  
    while(list.size > 3 ){
        result = ",${String(list[list.size-3..])}" + result
        list = list[..list.size-3]
    }
    result = "${String(list)}${result}"
    // The same as above ...
    if (fractional_part != "") {
        result = "${result}.${fractional_part}"
    }
    result
}

main() {
    println(solution("1294512.12412") == '1,294,512.12412')
    println(solution("0000123456789.99") == '123,456,789.99')
    println(solution("987654321") == '987,654,321')
}

LinkedList

import std.collection.*

func solution(s: String) {
    let strArray = s.trimStart("0").split(".")
    let integer_part = strArray[0]
    var fractional_part = ""
    if (strArray.size > 1) { fractional_part = strArray[1] }
    //  The same code as before ...
    var offest = 0
    var result = ""
    let link = LinkedList(integer_part.toRuneArray())
    let iter = link.lastNode.getOrThrow() |> link.backward
    for (i in 0..link.size) {
        result = "${iter.next().getOrThrow()}${result}"
        if (i == link.size - 1) { break }
        offest ++
        if (offest == 3) {
            result = ",${result}"
            offest = 0
        }
    }
    // The same code as before ...
    if (fractional_part != "") {
        result = "${result}.${fractional_part}"
    }
    result
}

main() {
    println(solution("1294512.12412") == '1,294,512.12412')
    println(solution("0000123456789.99") == '123,456,789.99')
    println(solution("987654321") == '987,654,321')
}

Rust

fn solution(s: &str) -> String {
    let s = s.trim_start_matches('0');
    let parts: Vec<&str> = s.split('.').collect();
    let integer_part = parts[0];
    let fractional_part = parts.get(1).unwrap_or(&"").to_string();
    let mut result = String::new();
    let mut integer_part = integer_part.to_string();
    while integer_part.len() > 3 {
        result = format!(",{}", &integer_part[integer_part.len() - 3..]) + &result;
        integer_part = integer_part[..integer_part.len() - 3].to_string();
    }
    result = integer_part + &result;
    if !fractional_part.is_empty() {
        result += &format!(".{}", fractional_part);
    }
    result
}

 fn main() {
    println!("{}", solution("1294512.12412") == "1,294,512.12412");
    println!("{}", solution("0000123456789.99") == "123,456,789.99");
    println!("{}", solution("987654321") == "987,654,321");
 }

Python

def solution(s: str) -> str:
    s = s.lstrip('0')
    if '.' in s:
        integer_part, fractional_part = s.split('.')
    else:
        integer_part, fractional_part = s, ''
    if integer_part:
        integer_part = ''.join(reversed(integer_part))
        integer_part = ','.join(integer_part[i:i+3]
                                for i in range(0, len(integer_part), 3))
        integer_part = ''.join(reversed(integer_part))
    if fractional_part:
        return f"{integer_part}.{fractional_part}"
    else:
        return integer_part

print(solution("1294512.12412") == '1,294,512.12412')
print(solution("0000123456789.99") == '123,456,789.99')
print(solution("987654321") == '987,654,321')

JavaScript

function solution(s) {
    s = s.replace(/^0+/, '');
    let parts = s.split('.');
    let integer_part = parts[0];
    let fractional_part = parts[1] || '';
    let result = '';
    while (integer_part.length > 3) {
        result = ',' + integer_part.slice(-3) + result;
        integer_part = integer_part.slice(0, integer_part.length - 3);
    }
    result = integer_part + result;
    if (fractional_part) {
        result += '.' + fractional_part;
    }
    return result;
}

console.log(solution("1294512.12412") === '1,294,512.12412');
console.log(solution("0000123456789.99") === '123,456,789.99');
console.log(solution("987654321") === '987,654,321');

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串的长度。
  • 空间复杂度:O(n),其中 n 是字符串的长度。