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

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

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

Loading…
Cancel
Save