如何在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
相关产品推荐
相关产品推荐

