如何在NiFi处理器中将e-notation转换为数字
科学计数法转普通数字并保留10位小数的解决方案
通用编程场景(以Python为例)
由于科学计数法格式不固定(比如E/e大小写、正负指数、尾数位数差异),字符串替换的方式无法覆盖所有情况,建议通过数值格式化的方式精确处理:
- 快速实现方案(适合常规精度需求)
def convert_e_notation(num_str): # 先转为浮点型,再格式化为10位小数的字符串 return "{0:.10f}".format(float(num_str)) # 测试示例 input_val = "5.249046E-4" print(convert_e_notation(input_val)) # 输出: 0.0005249046
- 高精度方案(避免浮点误差,适合对精度要求高的场景)
from decimal import Decimal, getcontext getcontext().prec = 15 # 设置足够的前置精度 def convert_e_notation(num_str): decimal_num = Decimal(num_str) # 强制格式化为10位小数,自动补零 return format(decimal_num, '.10f') # 测试示例 input_val = "5.249046E-4" print(convert_e_notation(input_val)) # 输出: 0.0005249046
Apache NiFi场景(替换Replacetext处理器)
如果是在NiFi流处理场景中,Replacetext无法适配多变的科学计数法格式,建议使用ExecuteScript处理器,通过Groovy脚本处理:
- 配置
ExecuteScript处理器,脚本语言选择Groovy - 输入以下处理脚本:
def flowFile = session.get() if (!flowFile) return flowFile = session.write(flowFile, { inputStream, outputStream -> def content = inputStream.text.trim() // 用BigDecimal保证精度,格式化为10位小数 def targetNum = new BigDecimal(content) def result = targetNum.setScale(10, BigDecimal.ROUND_HALF_UP).toPlainString() outputStream.write(result.getBytes('UTF-8')) } as StreamCallback) session.transfer(flowFile, REL_SUCCESS)
该脚本会自动处理所有合法格式的科学计数法字符串,转换为普通数字并保留10位小数,支持E/e、正负指数、任意合法尾数长度的输入。若流文件包含多行或多个数值,可扩展脚本逻辑遍历处理。
内容的提问来源于stack exchange,提问作者self lab
相关产品推荐
相关产品推荐

