# 数字和字符串格式化

# 问题描述

小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. 然后,循环字符串整数部分,移除掉前导的 0。
  3. 接下来,我们可以使用循环和字符串的拼接操作,将整数部分按照千分位逗号进行格式化。
  4. 最后,我们可以将格式化后的整数部分和小数部分拼接起来,得到最终的结果。

# 代码实现

  • python
# python
def format_number(s):
    # 将整数部分和小数部分分开
    if '.' in s:
        integer_part, decimal_part = s.split('.')
    else:
        integer_part, decimal_part = s, ''

    # 移除前导的 0
    integer_part = integer_part.lstrip('0')

    # 格式化整数部分
    formatted_integer_part = ''
    for i in range(len(integer_part)):
        formatted_integer_part += integer_part[i]
        if (i + 1) % 3 == 0 and (i + 1) != len(integer_part):
            formatted_integer_part += ','
    
    # 拼接整数部分和小数部分
    if decimal_part:
        formatted_number = formatted_integer_part + '.' + decimal_part
    else:
        formatted_number = formatted_integer_part

    return formatted_number
  • golang
// golang
func formatNumber(s string) string {
    // 将整数部分和小数部分分开
    parts := strings.Split(s, ".")
    integerPart := parts[0]
    decimalPart := ""
    if len(parts) > 1 {
        decimalPart = parts[1]
    }

    // 移除前导的 0
    integerPart = strings.TrimLeft(integerPart, "0")

    // 格式化整数部分
    formattedIntegerPart := ""
    for i := 0; i < len(integerPart); i++ {
        formattedIntegerPart += string(integerPart[i])
        if (i+1)%3 == 0 && i+1 != len(integerPart) {
            formattedIntegerPart += ","
        }
    }

    // 拼接整数部分和小数部分
    if decimalPart != "" {
        formattedNumber := formattedIntegerPart + "." + decimalPart
        return formattedNumber
    } else {
        return formattedIntegerPart
    }
}

# 复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串的长度。我们需要遍历字符串两次,一次是移除前导的 0,一次是格式化整数部分。
  • 空间复杂度:O(n),其中 n 是字符串的长度。我们需要额外的空间来存储格式化后的整数部分和小数部分。

# 测试样例

  • python
print(format_number("1294512.12412"))  # '1,294,512.12412'
print(format_number("0000123456789.99"))  # '123,456,789.99'
print(format_number("987654321"))  # '987,654,321'
  • golang
fmt.Println(formatNumber("1294512.12412"))  // '1,294,512.12412'
fmt.Println(formatNumber("0000123456789.99"))  // '123,456,789.99'
fmt.Println(formatNumber("987654321"))  // '987,654,321'