You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:36:03