PHP使用FILTER_SANITIZE_NUMBER_INT丢失前置0和逗号如何解决?
你现有代码不符合预期的核心原因是 FILTER_SANITIZE_NUMBER_INT 过滤器的特性:它仅会保留字符串中的数字、正负号,会自动删除逗号、小数点等所有非整数相关符号。你的示例字符串.nl per month: 0,83经过该过滤器处理后会得到083,强制转为int类型时前导零会被忽略,最终得到结果83。
可行解决方法
方案1:正则提取(最通用,直接拿到
0,83字符串格式)
直接用正则匹配符合你要求的「数字+逗号+数字」组合即可:// 匹配字符串中所有 数字,数字 格式的片段 preg_match('/\d+,\d+/', $fileLines[1], $matches); // 匹配成功就取结果,没匹配到可以自定义默认值 $nlMonth = $matches[0] ?? '0,00';如果你需要把结果转为数值用于计算,可以把逗号替换为小数点后转浮点型:
preg_match('/\d+,\d+/', $fileLines[1], $matches); $nlMonthFloat = isset($matches[0]) ? (float)str_replace(',', '.', $matches[0]) : 0.0;方案2:使用数字格式化器(适配逗号作为小数分隔符的区域格式)
如果你的业务场景中固定用逗号作为小数分隔符,可以用PHP内置的NumberFormatter类做区域化数字解析,适合多区域格式的业务场景:// 初始化荷兰区域的数字格式化器(荷兰默认用逗号做小数分隔符) $formatter = new NumberFormatter('nl_NL', NumberFormatter::DECIMAL); // 先提取冒号后的数值部分 preg_match('/:\s*(.+)$/', $fileLines[1], $match); // 直接解析为浮点型数值,结果为0.83 $nlMonth = $formatter->parse($match[1] ?? ''); // 如果需要输出0,83的字符串格式,可以调用format方法 $nlMonthStr = $formatter->format($nlMonth);
内容的提问来源于stack exchange,提问作者JasHam
相关产品推荐
相关产品推荐

