You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中用正则表达式或数学库实现特定数字格式化?

数字格式化需求实现问题

我需要对数字进行如下格式化:

  • 取到小数点后第一个非0数字;
  • 若小数点后第一位即为非0数字,则保留两位小数;
  • 若小数点后全为0,则保留为x.0。

具体示例如下:

"0.00820289933" => "0.008"
"0.00000025252" => "0.0000002"
"0.858282815215" => "0.85"
"0.075787842545" => "0.07"
"1.100000010999" => "1.10"
"0.0"            => "0.0"
"0.000000000000" => "0.0" 
"0.000365266565" => "0.0003" 
"0.000036526656" => "0.00003" 
"0.000003652665" => "0.000003" 
"0.000000365266" => "0.0000003" 

我尝试了以下Python代码,但未达到预期效果,请问如何实现该需求?

def format_adjusted_value(value):
    str_value = str(value)

    if '.' in str_value:
        match = re.match(r'(\d*\.\d*?[1-9])0*$', str_value)

        if match:
            formatted_value = match.group(1)
        else:
            match = re.match(r'(\d*\.\d*?[0-9])0*$', str_value)
            formatted_value = match.group(1) if match else str_value
    else:
        formatted_value = str_value

    return formatted_value

解决方案

方案一:正则表达式精准匹配

通过正则分组覆盖三种核心场景,直接提取符合要求的格式内容:

import re

def format_adjusted_value(value):
    str_val = str(value).strip()
    
    # 处理小数点后全为0的情况
    if re.match(r'^\d+\.0+$', str_val):
        return f"{int(float(str_val))}.0"
    
    # 匹配小数点后第一位就是非0的情况,保留两位小数
    first_non_zero_head = re.match(r'^(\d+\.[1-9]\d)', str_val)
    if first_non_zero_head:
        return first_non_zero_head.group(1)
    
    # 匹配小数点后有若干0后出现第一个非0的情况,取到该非0数字为止
    leading_zeros_case = re.match(r'^(\d+\.0*[1-9])', str_val)
    if leading_zeros_case:
        return leading_zeros_case.group(1)
    
    # 兜底处理整数输入
    return f"{str_val}.0" if '.' not in str_val else str_val

方案二:字符串遍历处理

通过遍历小数点后字符,定位第一个非0数字的位置,再根据位置执行对应逻辑:

def format_adjusted_value(value):
    str_val = str(value).strip()
    
    if '.' not in str_val:
        return f"{str_val}.0"
    
    integer_part, decimal_part = str_val.split('.', 1)
    
    # 处理小数点后全为0的情况
    if all(c == '0' for c in decimal_part):
        return f"{integer_part}.0"
    
    # 找到第一个非0数字的索引
    first_non_zero_idx = next((i for i, c in enumerate(decimal_part) if c != '0'), len(decimal_part))
    
    if first_non_zero_idx == 0:
        # 小数点后第一位非0,保留两位小数
        return f"{integer_part}.{decimal_part[:2]}"
    else:
        # 取到第一个非0数字为止
        return f"{integer_part}.{decimal_part[:first_non_zero_idx + 1]}"

验证效果

将示例输入传入上述任意函数,均可得到预期输出,比如:

  • format_adjusted_value("0.00820289933") 返回 "0.008"
  • format_adjusted_value("0.858282815215") 返回 "0.85"
  • format_adjusted_value("0.0") 返回 "0.0"

内容的提问来源于stack exchange,提问作者theoyuncu13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:17:47