商品页刚打开价格正常,选择颜色或尺寸后却显示NaN。price-box只是最终显示者,真正的坏值通常来自 spConfig.optionPrices、custom option价格配置,或插件把格式化后的“1,299.00”重新参与计算。
在控制台抓到第一个非数字值
require(['jquery'], function ($) {
var box = $('[data-role=priceBox]').data('mage-priceBox');
console.log(box && box.cache && box.cache.displayPrices);
});
console.log(window.spConfig && window.spConfig.optionPrices);
再从页面源代码搜索 optionPrices 和 priceConfig。原始计算字段必须是JSON number,例如 1299.5,不能是字符串 "1,299.50"、空字符串或带货币符号的值。
服务端自定义代码的修正点
如果插件修改ConfigurableProduct的JSON配置,返回值要保持数值类型:
$config['optionPrices'][$id]['finalPrice']['amount'] = (float)$amount; // 不要在这里调用priceCurrency->format()
显示格式交给Magento的price-utils处理。本地化小数逗号只应出现在展示层;业务计算层统一使用点号小数。
只在某个选项出错
- 检查该简单商品的special_price、tier price和customer group price是否为空字符串;
- 检查自定义选项价格是否被第三方导入脚本写成含逗号字符串;
- 确认货币切换插件没有把汇率API的字符串原样相乘;
- 比较正常和异常simple product在optionPrices中的节点,找出第一个字段差异。
清理与验证
bin/magento indexer:reindex catalog_product_price bin/magento cache:clean layout block_html full_page
部署环境还要清理对应主题静态文件。测试基础价、特价、tier price、含税/未税、两种货币和每个可配置选项;同时观察Network中没有JS异常。只用 parseFloat(value.replace(',', '')) 在前端兜底不是根治,因为不同地区逗号可能是小数分隔符。

