WooCommerce:如何将wc_price输出值转换为数值类型?
解决WooCommerce wc_price返回值无法转为数值计算总和的问题
问题场景
我正在开发一个包含「州」和「销售额」两列的表格,原本计划用wc_price()函数获取销售额列的数值,前端正常显示货币格式(如CA $1,652.13、CO $515.80等),表格至少50行对应各州,最后一行需要计算并显示所有金额的总和。
但实际发现wc_price()返回的是一段HTML代码:
<bdi> <span class="woocommerce-Price-currencySymbol">$</span> 435.50 </bdi>
尝试用strip_tags()提取数字时遇到问题:
$numeric = strip_tags(wc_price($total)); // 结果为带$符号的普通字符串 echo str_replace("$","",$numeric) . "<br>"; // 无法去除$符号 $tally = $tally + $numeric; // 触发非数值类型错误
错误出现在$tally =行——即使去掉HTML标签得到字符串$435.50,也无法移除$符号,尝试用(int)、intval()、(float)、floatval()及number_format()都无法将其转为数值,报错信息如下:
警告:在C:\xampp\htdocs\mysite\wp-content\plugins\my-custom-plugin\my-custom-plugin.php第104行遇到非数值类型
解决方案
方法1:直接用原始数值计算(最优方案)
wc_price()的作用是格式化货币用于前端显示,计算总和完全不需要先转成HTML再反向解析——直接用从数据库/订单中获取的原始数值(比如$total本身就是float类型的435.50)累加即可:
// 假设$total是未格式化的原始数值(如435.50) $tally += $total; // 直接累加,无类型问题 // 前端显示时再用wc_price格式化输出 echo wc_price($total);
方法2:正则提取纯数值(必须解析wc_price返回值时用)
问题根源可能是strip_tags()后得到的$符号是非ASCII的特殊字符,或者字符串中存在隐藏空白。用正则表达式直接提取所有数字和小数点,就能得到纯数值字符串:
$price_html = wc_price($total); // 过滤掉所有非数字和小数点的字符 $numeric_price = preg_replace('/[^0-9.]/', '', strip_tags($price_html)); // 转为float类型后累加 $tally += (float)$numeric_price;
方法3:用WooCommerce内置工具函数
WooCommerce提供了专门处理货币字符串的函数wc_string_to_float(),可以直接将带货币符号的字符串转为数值:
$price_html = wc_price($total); $clean_price = strip_tags($price_html); // 用内置函数转换为数值 $numeric_price = wc_string_to_float($clean_price); $tally += $numeric_price;
内容的提问来源于stack exchange,提问作者TARKUS
相关产品推荐
相关产品推荐

