Rails中如何将Excel数字格式值转换为数值(兼容括号负数场景)
Rails 读取Excel格式化数值转数字类型的正则调整方案
原有实现value.to_s.gsub(/[^0-9.-]+/, '')仅粗暴保留数字、小数点、横杠字符,无法识别会计格式中用括号包裹代表负数的场景,无法覆盖$(10000)这类格式的转换需求,可通过「先识别负数标识、再清洗无关字符、最后转数值类型」的逻辑实现全规则覆盖。
实现代码
def convert_excel_number(value) str = value.to_s.strip # 识别两种负数场景:括号包裹的会计格式、前置负号格式 negative = str.match?(/\(.*\d.*\)/) || str.start_with?('-') # 清除所有非数字、非小数点的干扰字符($、逗号、括号等) num_str = str.gsub(/[^0-9.]/, '') # 转数值,如需高精度金额计算可将to_f替换为to_d转BigDecimal result = num_str.to_f negative ? -result : result end
规则覆盖验证
所有给定转换规则的执行结果均符合预期:
convert_excel_number('$10000.00')→10000.00convert_excel_number('10000.00')→10000.00convert_excel_number('$(10000)')→-10000.0convert_excel_number('$10,000')→10000.0convert_excel_number('$(10,000)')→-10000.0convert_excel_number('-$10,000')→-10000.0
注意事项
如果处理的是金额类数值,不要使用to_f做类型转换(浮点数存在精度丢失问题),Rails环境下可将to_f替换为to_d,转换为BigDecimal类型保证计算精度。
内容的提问来源于stack exchange,提问作者Kunal Vashist
相关产品推荐
相关产品推荐

