Browse Source

修复还价小数点问题

Xfy
User 5 days ago
parent
commit
13d84b00f4
  1. BIN
      images/background.png
  2. 202
      pages/compare_price/index.js
  3. 44
      pages/goods-detail/goods-detail.js

BIN
images/background.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 672 KiB

202
pages/compare_price/index.js

@ -43,6 +43,22 @@ function processSpecifications(spec) {
return specs; return specs;
} }
// 格式化价格,最多显示一位小数
function formatPrice(price) {
if (price === null || price === undefined) {
return price;
}
// 转换为数字
const numPrice = parseFloat(price);
if (isNaN(numPrice)) {
return price;
}
// 格式化到一位小数
return numPrice.toFixed(1);
}
Page({ Page({
data: { data: {
// 页面数据 // 页面数据
@ -111,6 +127,22 @@ Page({
if (Array.isArray(goodsData.price)) { if (Array.isArray(goodsData.price)) {
goodsData.price = goodsData.price[0]; goodsData.price = goodsData.price[0];
} }
// 格式化价格,最多显示一位小数
goodsData.price = formatPrice(goodsData.price);
}
// 处理原始价格
if (goodsData.originalPrice) {
// 如果原始价格是字符串且包含逗号,只取第一个价格
if (typeof goodsData.originalPrice === 'string' && goodsData.originalPrice.includes(',')) {
goodsData.originalPrice = goodsData.originalPrice.split(',')[0].trim();
}
// 如果原始价格是数组,只取第一个价格
if (Array.isArray(goodsData.originalPrice)) {
goodsData.originalPrice = goodsData.originalPrice[0];
}
// 格式化原始价格,最多显示一位小数
goodsData.originalPrice = formatPrice(goodsData.originalPrice);
} }
// 保存选择的种类、规格和当前商品数据到页面数据 // 保存选择的种类、规格和当前商品数据到页面数据
@ -305,6 +337,22 @@ Page({
if (Array.isArray(item.price)) { if (Array.isArray(item.price)) {
item.price = item.price[0]; item.price = item.price[0];
} }
// 格式化价格,最多显示一位小数
item.price = formatPrice(item.price);
}
// 处理原始价格
if (item.originalPrice) {
// 如果原始价格是字符串且包含逗号,只取第一个价格
if (typeof item.originalPrice === 'string' && item.originalPrice.includes(',')) {
item.originalPrice = item.originalPrice.split(',')[0].trim();
}
// 如果原始价格是数组,只取第一个价格
if (Array.isArray(item.originalPrice)) {
item.originalPrice = item.originalPrice[0];
}
// 格式化原始价格,最多显示一位小数
item.originalPrice = formatPrice(item.originalPrice);
} }
// 处理规格信息,将多个净重信息分割成数组 // 处理规格信息,将多个净重信息分割成数组
@ -479,73 +527,101 @@ Page({
); );
// 清理 mediaItems 中的 URL,去除反引号和空格 // 清理 mediaItems 中的 URL,去除反引号和空格
// 同时处理 imageUrls 字段,将其转换为 mediaItems 格式 // 同时处理 imageUrls 字段,将其转换为 mediaItems 格式
// 处理库存显示逻辑 // 处理库存显示逻辑
const cleanedGoods = filteredGoods.map(item => { const cleanedGoods = filteredGoods.map(item => {
// 首先清理 imageUrls 字段(如果存在) // 首先清理 imageUrls 字段(如果存在)
if (item.imageUrls && Array.isArray(item.imageUrls)) { if (item.imageUrls && Array.isArray(item.imageUrls)) {
item.imageUrls = item.imageUrls.map(url => { item.imageUrls = item.imageUrls.map(url => {
return url.trim().replace(/[`]/g, ''); return url.trim().replace(/[`]/g, '');
}); });
// 使用processMediaUrls函数处理媒体数据
item.mediaItems = processMediaUrls(item.imageUrls);
// 确保图片优先显示:将图片类型的媒体项移到数组前面
if (item.mediaItems && item.mediaItems.length > 1) {
const imageItems = item.mediaItems.filter(media => media.type === 'image');
const videoItems = item.mediaItems.filter(media => media.type === 'video');
item.mediaItems = [...imageItems, ...videoItems];
}
}
// 使用processMediaUrls函数处理媒体数据 // 清理 mediaItems 中的 URL
item.mediaItems = processMediaUrls(item.imageUrls); if (item.mediaItems && Array.isArray(item.mediaItems)) {
item.mediaItems = item.mediaItems.map(media => {
if (media.url) {
// 去除 URL 中的反引号和空格
media.url = media.url.trim().replace(/[`]/g, '');
// 确保媒体类型正确
if (!media.type) {
media.type = isVideoUrl(media.url) ? 'video' : 'image';
}
}
return media;
});
}
// 确保图片优先显示:将图片类型的媒体项移到数组前面 // 清理价格字段,确保只显示单一价格
if (item.mediaItems && item.mediaItems.length > 1) { if (item.price) {
const imageItems = item.mediaItems.filter(media => media.type === 'image'); // 如果价格是字符串且包含逗号,只取第一个价格
const videoItems = item.mediaItems.filter(media => media.type === 'video'); if (typeof item.price === 'string' && item.price.includes(',')) {
item.mediaItems = [...imageItems, ...videoItems]; item.price = item.price.split(',')[0].trim();
}
// 如果价格是数组,只取第一个价格
if (Array.isArray(item.price)) {
item.price = item.price[0];
}
// 格式化价格,最多显示一位小数
item.price = formatPrice(item.price);
} }
}
// 处理原始价格
// 清理 mediaItems 中的 URL if (item.originalPrice) {
if (item.mediaItems && Array.isArray(item.mediaItems)) { // 如果原始价格是字符串且包含逗号,只取第一个价格
item.mediaItems = item.mediaItems.map(media => { if (typeof item.originalPrice === 'string' && item.originalPrice.includes(',')) {
if (media.url) { item.originalPrice = item.originalPrice.split(',')[0].trim();
// 去除 URL 中的反引号和空格
media.url = media.url.trim().replace(/[`]/g, '');
// 确保媒体类型正确
if (!media.type) {
media.type = isVideoUrl(media.url) ? 'video' : 'image';
}
} }
return media; // 如果原始价格是数组,只取第一个价格
}); if (Array.isArray(item.originalPrice)) {
} item.originalPrice = item.originalPrice[0];
}
// 处理规格信息,将多个净重信息分割成数组 // 格式化原始价格,最多显示一位小数
item.processedSpecs = []; item.originalPrice = formatPrice(item.originalPrice);
if (item.specification) { }
item.processedSpecs = processSpecifications(item.specification);
} else if (item.weightSpec) { // 处理规格信息,将多个净重信息分割成数组
item.processedSpecs = processSpecifications(item.weightSpec); item.processedSpecs = [];
} else if (item.grossWeight) { if (item.specification) {
item.processedSpecs = processSpecifications(item.grossWeight); item.processedSpecs = processSpecifications(item.specification);
} } else if (item.weightSpec) {
item.processedSpecs = processSpecifications(item.weightSpec);
// 处理库存显示逻辑(参考首页的处理方式) } else if (item.grossWeight) {
const quantity = item.quantity || item.minOrder || item.stock || item.inventory || item.availableStock || item.totalAvailable; item.processedSpecs = processSpecifications(item.grossWeight);
const totalStock = quantity; }
let displayStock; // 处理库存显示逻辑(参考首页的处理方式)
if (totalStock >= 10000) { const quantity = item.quantity || item.minOrder || item.stock || item.inventory || item.availableStock || item.totalAvailable;
// 库存>=10000时显示"库存充足" const totalStock = quantity;
displayStock = '充足';
} else if (totalStock === 0) { let displayStock;
// 库存=0时显示"暂无" if (totalStock >= 10000) {
displayStock = '暂无'; // 库存>=10000时显示"库存充足"
} else { displayStock = '充足';
// 其他情况显示具体数字 } else if (totalStock === 0) {
displayStock = totalStock; // 库存=0时显示"暂无"
} displayStock = '暂无';
} else {
// 更新商品的库存显示 // 其他情况显示具体数字
item.totalStock = displayStock; displayStock = totalStock;
item.originalTotalStock = totalStock; }
return item; // 更新商品的库存显示
}); item.totalStock = displayStock;
item.originalTotalStock = totalStock;
return item;
});
console.log('过滤后的商品列表:', cleanedGoods); console.log('过滤后的商品列表:', cleanedGoods);
// 检查商品数据结构 // 检查商品数据结构

44
pages/goods-detail/goods-detail.js

@ -338,6 +338,22 @@ function formatDateTime(dateString) {
return dateString; return dateString;
} }
// 格式化价格,解决浮点数精度问题
function formatPrice(price) {
if (price === null || price === undefined) {
return price;
}
// 转换为数字
const numPrice = parseFloat(price);
if (isNaN(numPrice)) {
return price;
}
// 格式化到一位小数
return parseFloat(numPrice.toFixed(1));
}
// 格式化北京时间的函数 // 格式化北京时间的函数
function formatBeijingTime(dateString) { function formatBeijingTime(dateString) {
if (!dateString) return '未知时间'; if (!dateString) return '未知时间';
@ -793,9 +809,9 @@ Page({
} }
const priceRange = middlePrice < 20 ? 1 : 5; const priceRange = middlePrice < 20 ? 1 : 5;
const minPrice = middlePrice - priceRange; const minPrice = formatPrice(middlePrice - priceRange);
const maxPrice = middlePrice + priceRange; const maxPrice = formatPrice(middlePrice + priceRange);
const defaultPrice = parseFloat(middlePrice.toFixed(2)); const defaultPrice = formatPrice(middlePrice);
const priceThreshold = middlePrice < 20 ? 0.1 : 2; const priceThreshold = middlePrice < 20 ? 0.1 : 2;
console.log('计算后的价格数据:', { console.log('计算后的价格数据:', {
@ -855,9 +871,9 @@ Page({
} }
const priceRange = middlePrice < 20 ? 1 : 5; const priceRange = middlePrice < 20 ? 1 : 5;
const minPrice = middlePrice - priceRange; const minPrice = formatPrice(middlePrice - priceRange);
const maxPrice = middlePrice + priceRange; const maxPrice = formatPrice(middlePrice + priceRange);
const currentPrice = parseFloat(middlePrice.toFixed(2)); const currentPrice = formatPrice(middlePrice);
const priceThreshold = middlePrice < 20 ? 0.3 : 2; const priceThreshold = middlePrice < 20 ? 0.3 : 2;
console.log('选择规格 - 价格数据:', { console.log('选择规格 - 价格数据:', {
@ -926,7 +942,7 @@ Page({
if (bargainPrice > minPrice) { if (bargainPrice > minPrice) {
const step = bargainPrice < 20 ? 0.1 : 1; const step = bargainPrice < 20 ? 0.1 : 1;
const newPrice = parseFloat((bargainPrice - step).toFixed(2)); const newPrice = formatPrice(bargainPrice - step);
console.log('计算新价格:', newPrice); console.log('计算新价格:', newPrice);
this.updatePrice(newPrice); this.updatePrice(newPrice);
} }
@ -943,7 +959,7 @@ Page({
if (bargainPrice < maxPrice) { if (bargainPrice < maxPrice) {
const step = bargainPrice < 20 ? 0.1 : 1; const step = bargainPrice < 20 ? 0.1 : 1;
const newPrice = parseFloat((bargainPrice + step).toFixed(2)); const newPrice = formatPrice(bargainPrice + step);
console.log('计算新价格:', newPrice); console.log('计算新价格:', newPrice);
this.updatePrice(newPrice); this.updatePrice(newPrice);
} }
@ -954,7 +970,7 @@ Page({
const { minPrice, maxPrice } = this.data; const { minPrice, maxPrice } = this.data;
const clampedPrice = Math.max(minPrice, Math.min(maxPrice, newPrice)); const clampedPrice = Math.max(minPrice, Math.min(maxPrice, newPrice));
const progress = ((clampedPrice - minPrice) / (maxPrice - minPrice)) * 100; const progress = ((clampedPrice - minPrice) / (maxPrice - minPrice)) * 100;
const finalPrice = parseFloat(clampedPrice.toFixed(2)); const finalPrice = formatPrice(clampedPrice);
console.log('更新价格:', { console.log('更新价格:', {
inputPrice: newPrice, inputPrice: newPrice,
@ -1018,8 +1034,10 @@ Page({
if (!isNaN(price)) { if (!isNaN(price)) {
const clampedPrice = Math.max(minPrice, Math.min(maxPrice, price)); const clampedPrice = Math.max(minPrice, Math.min(maxPrice, price));
const formattedPrice = formatPrice(clampedPrice);
console.log('计算后的价格:', clampedPrice); console.log('计算后的价格:', clampedPrice);
this.updatePrice(clampedPrice); console.log('格式化后的价格:', formattedPrice);
this.updatePrice(formattedPrice);
} }
this.setData({ this.setData({
@ -1056,11 +1074,7 @@ Page({
const priceRange = maxPrice - minPrice; const priceRange = maxPrice - minPrice;
let price = minPrice + (progress / 100) * priceRange; let price = minPrice + (progress / 100) * priceRange;
if (bargainPrice < 20) { price = formatPrice(price);
price = Math.round(price * 10) / 10;
} else {
price = Math.round(price);
}
const clampedPrice = Math.max(minPrice, Math.min(maxPrice, price)); const clampedPrice = Math.max(minPrice, Math.min(maxPrice, price));

Loading…
Cancel
Save