求助:将priceOrigin等价格字符串转为数值类型失败,求解决方案
如何将字符串类型的价格字段转换为数值类型
错误原因分析
SQL格式转换逻辑错误
你在SQL里用REPLACE(p.price_origin, '.', ',')把小数点换成了逗号,导致价格字符串变成"199,99"这类格式。但JavaScript的Number()函数只识别小数点.,带逗号的字符串会被解析成NaN,自然无法转换为有效数值。Service层逻辑完全错位
userCart是DAO返回的查询结果数组(哪怕只有一个用户,SQL返回的也是数组结构),你直接给数组本身添加priceOrigin属性完全无效——这些价格字段实际存在于products数组的每个商品对象里。- 你仅完成了
products的JSON解析,但没有遍历每个商品去处理价格字段。
修复方案
方案1:从SQL源头解决(推荐)
直接让SQL返回数值类型,避免转成带逗号的字符串,后续转换更简洁可靠。
修正后的controller.js
const readUserCart = async userId => { const userCart = await myDataSource.query( `SELECT u.id AS userId, u.name AS userName, JSON_ARRAYAGG( JSON_OBJECT( 'cartId', c_o.id, 'priceOrigin', p.price_origin, -- 去掉REPLACE,直接返回数值 'salePrice', p.sale_price, 'price', CASE WHEN p.sale_price IS NULL THEN p.price_origin * quantity ELSE p.sale_price * quantity END ) )AS products FROM users u JOIN cart_order c_o ON c_o.user_id = u.id -- 调整JOIN顺序,避免关联错误 JOIN products p ON p.id = c_o.product_id WHERE u.id = ? GROUP BY u.id`, [userId] ); return userCart; };
修正后的service.js
const readUserCart = async userId => { const userCart = await cartOrderDao.readUserCart(userId); // 遍历每个用户数据,处理商品列表中的价格字段 return userCart.map(data => { const processedProducts = JSON.parse(data.products).map(product => ({ ...product, priceOrigin: Number(product.priceOrigin) * 1000, salePrice: product.salePrice ? Number(product.salePrice) * 1000 : null, price: Number(product.price) * 1000 })); return { ...data, products: processedProducts }; }); };
方案2:如果必须保留SQL的逗号格式
要是业务上要求SQL返回带逗号的字符串,转换时先把逗号换回小数点再处理:
// Service层中处理商品的部分替换为以下代码 const processedProducts = JSON.parse(data.products).map(product => ({ ...product, priceOrigin: Number(product.priceOrigin.replace(',', '.')) * 1000, salePrice: product.salePrice ? Number(product.salePrice.replace(',', '.')) * 1000 : null, price: Number(product.price.replace(',', '.')) * 1000 }));
内容的提问来源于stack exchange,提问作者ggyoE
相关产品推荐
相关产品推荐

