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

求助:将priceOrigin等价格字符串转为数值类型失败,求解决方案

如何将字符串类型的价格字段转换为数值类型

错误原因分析

  1. SQL格式转换逻辑错误
    你在SQL里用REPLACE(p.price_origin, '.', ',')把小数点换成了逗号,导致价格字符串变成"199,99"这类格式。但JavaScript的Number()函数只识别小数点.,带逗号的字符串会被解析成NaN,自然无法转换为有效数值。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:05:27