Julia中如何替换字符串内数字为取整值?已尝试代码失败求助
解决Julia中字符串数字四舍五入替换的问题
我来帮你搞定这个字符串数字替换的问题!你的需求是把字符串里的数字四舍五入后替换回去,比如把-123.456789/EI + 2345.678901/EA变成类似-123.46/EI+2345.7/EA的结果,但你原来的代码没法正常运行,咱们来一步步解决。
先说说你原代码的问题
你的代码里有两个关键问题:
matchall在Julia 1.0及以后的版本已经被废弃了,而且就算用替代方法拿到所有匹配结果,直接把整个数组传给parse也不行——parse只能处理单个字符串,不能解析数组。replace的用法不对:你试图一次性处理所有匹配结果,但replace如果要做动态替换,应该传入一个函数,让它对每个匹配到的子串单独处理,而不是把所有结果当成一个整体去替换。
正确的实现方法
咱们用replace的函数替换模式,对每个匹配到的数字字符串单独解析、四舍五入,再格式化输出(还能自动去掉末尾多余的零,让结果更整洁)。
通用版本(统一小数位数)
比如我们想把所有数字四舍五入到两位小数,同时去掉末尾的零:
string1 = "-123.456789/EI + 2345.678901/EA" result = replace(string1, r"-?\d+\.?\d*" do s # 把匹配到的字符串解析成浮点数 num = parse(Float64, s) # 四舍五入到指定小数位,这里是2位 rounded_num = round(num, digits=2) # 转换为字符串后,去掉末尾的.0和多余的零 num_str = string(rounded_num) num_str = replace(num_str, r"\.0+$" => "") replace(num_str, r"(\.\d+)0+$" => s"\1") end) # 如果需要去掉字符串里的空格,再加一步 result = replace(result, r"\s+" => "")
运行后会得到:"-123.46/EI+2345.68/EA"
如果想改成保留一位小数,只需要把digits=2改成digits=1,结果就会变成:"-123.5/EI+2345.7/EA",和你给出的例子更接近。
自定义小数位数的函数版本
如果需要频繁调整小数位数,也可以单独定义一个函数,用起来更方便:
string1 = "-123.456789/EI + 2345.678901/EA" # 定义处理单个数字字符串的函数 function format_rounded_num(s::AbstractString, target_digits::Int) num = parse(Float64, s) rounded_num = round(num, digits=target_digits) num_str = string(rounded_num) # 清理末尾的零和多余小数点 num_str = replace(num_str, r"\.0+$" => "") replace(num_str, r"(\.\d+)0+$" => s"\1") end # 调用时指定小数位数,比如一位 result = replace(string1, r"-?\d+\.?\d*" => s -> format_rounded_num(s, 1)) # 去掉空格 result = replace(result, r"\s+" => "")
这样就能灵活控制每个数字的四舍五入精度啦!
内容的提问来源于stack exchange,提问作者Thanh Nguyen
相关产品推荐
相关产品推荐

