如何将K、M、B格式字符串转为纯数字?求简洁实现方案
简洁实现带K/M/B后缀的字符串转数字(大小写不敏感)
核心思路
不用繁琐的switch case分支,通过正则表达式提取数字与后缀+映射表匹配倍率的方式实现,代码更简洁易维护,还天然支持大小写不敏感。
Python 实现
import re def str_to_num(s): # 定义后缀对应的倍率,统一转小写处理 suffix_map = {'k': 1000, 'm': 10**6, 'b': 10**9} # 正则匹配:数字部分(整数/小数)+ 可选后缀(大小写不敏感) match = re.match(r'^(\d+\.?\d*)([kmb]?)$', s.strip(), re.IGNORECASE) if not match: raise ValueError("Invalid input format") num_part, suffix = match.groups() num = float(num_part) # 无后缀则直接返回,有后缀则乘以对应倍率后转整数(匹配示例需求) if suffix: return int(num * suffix_map[suffix.lower()]) return int(num) if num.is_integer() else num
JavaScript 实现
function strToNum(s) { const suffixMap = {'k': 1000, 'm': 1e6, 'b': 1e9}; // 正则匹配数字和后缀,忽略大小写 const match = s.trim().match(/^(\d+\.?\d*)([kmb]?)$/i); if (!match) throw new Error('Invalid input format'); const [, numPart, suffix] = match; let num = parseFloat(numPart); if (suffix) { num *= suffixMap[suffix.toLowerCase()]; // 示例中结果均为整数,这里做取整处理 return Number.isInteger(num) ? num : Math.round(num); } return Number.isInteger(num) ? num : num; }
测试验证
输入输出完全匹配需求:
786 → 786 2423 → 2423 1k → 1000 5.816k → 5816 10.61k → 10610 2.5m → 2500000 1.250064b → 1250064000 1K → 1000 3.2M → 3200000
说明
- 正则表达式
^(\d+\.?\d*)([kmb]?)$确保匹配整数、小数,以及可选的K/M/B后缀,re.IGNORECASE(Python)或i标志(JS)实现大小写不敏感。 - 映射表可灵活扩展(比如添加'T'代表万亿),比switch case更易维护。
- 结果根据示例需求转为整数,若需保留小数可去掉
int()或取整逻辑。
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

