|
谢谢楼主的分享。在楼主的基础上作了些改进: 解决了价钱浮点数运算精度问题,existproduct的一个小bug, 增加了方法getproductbyid 和 clear用于请客购物车。扩展了product 数据结构以便显示图片,价格单位,类别。下面是源码,以测试通过:
utils = {
setParam : function (name,value){
localStorage.setItem(name,value)
},
getParam : function(name){
return localStorage.getItem(name)
}
}
product={
sid:"",
id:0,
name:"",
num:0,
price:0.00,
unit:'',
image:''
};
orderdetail={
username:"",
phone:"",
address:"",
zipcode:"",
totalNumber:0,
totalAmount:0.00
}
// 两个浮点数求和
function accAdd(num1, num2) {
var r1, r2, m;
try {
r1 = num1.toString().split('.')[1].length;
} catch(e) {
r1 = 0;
}
try {
r2 = num2.toString().split(".")[1].length;
} catch(e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2));
// return (num1*m+num2*m)/m;
return Math.round(num1 * m + num2 * m) / m;
}
// 两个浮点数相减
function accSub(num1, num2) {
var r1, r2, m;
try {
r1 = num1.toString().split('.')[1].length;
} catch(e) {
r1 = 0;
}
try {
r2 = num2.toString().split(".")[1].length;
} catch(e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2));
n = (r1 >= r2) ? r1 : r2;
return (Math.round(num1 * m - num2 * m) / m).toFixed(n);
}
// 两数相除
function accDiv(num1, num2) {
var t1, t2, r1, r2;
try {
t1 = num1.toString().split('.')[1].length;
} catch(e) {
t1 = 0;
}
try {
t2 = num2.toString().split(".")[1].length;
} catch(e) {
t2 = 0;
}
r1 = Number(num1.toString().replace(".", ""));
r2 = Number(num2.toString().replace(".", ""));
return (r1 / r2) * Math.pow(10, t2 - t1);
}
// 浮点数相乘
function accMul(num1, num2) {
var m = 0, s1 = num1.toString(), s2 = num2.toString();
try {
m += s1.split(".")[1].length
} catch(e) {
};
try {
m += s2.split(".")[1].length
} catch(e) {
};
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
cart = {
//向购物车中添加商品
addproduct:function(product){
var ShoppingCart = utils.getParam("ShoppingCart");
if(ShoppingCart==null||ShoppingCart==""){
//第一次加入商品
var jsonstr = {"productlist":[{"sid":product.sid,"id":product.id,"name":product.name,"num":product.num,"price":product.price,"unit":product.unit,"image":product.image}],"totalNumber":product.num,"totalAmount"product.price*product.num)};
utils.setParam("ShoppingCart","'"+ JSON.stringify(jsonstr));
}else{
var jsonstr = JSON.parse(ShoppingCart.substr(1,ShoppingCart.length));
var productlist = jsonstr.productlist;
var result=false;
//查找购物车中是否有该商品
for(var i in productlist){
if(productlist[i].id==product.id){
productlist[i].num=parseInt(productlist[i].num)+parseInt(product.num);
result = true;
}
}
if(!result){
//没有该商品就直接加进去
productlist.push({"sid":product.sid,"id":product.id,"name":product.name,"num":product.num,"price":product.price,"unit":product.unit,"image":product.image});
}
//重新计算总价
jsonstr.totalNumber=parseInt(jsonstr.totalNumber)+parseInt(product.num);
// jsonstr.totalAmount=parseFloat(jsonstr.totalAmount)+(parseInt(product.num)*parseFloat(product.price));
jsonstr.totalAmount=accAdd(jsonstr.totalAmount, accMul(product.num, product.price));
orderdetail.totalNumber = jsonstr.totalNumber;
orderdetail.totalAmount = jsonstr.totalAmount;
//保存购物车
utils.setParam("ShoppingCart","'"+JSON.stringify(jsonstr));
}
},
//修改给买商品数量
updateproductnum:function(id,num){
var ShoppingCart = utils.getParam("ShoppingCart");
var jsonstr = JSON.parse(ShoppingCart.substr(1,ShoppingCart.length));
var productlist = jsonstr.productlist;
for(var i in productlist){
if(productlist[i].id==id){
jsonstr.totalNumber=parseInt(jsonstr.totalNumber)+(parseInt(num)-parseInt(productlist[i].num));
// jsonstr.totalAmount=parseFloat(jsonstr.totalAmount)+((parseInt(num)*parseFloat(productlist[i].price))-parseInt(productlist[i].num)*parseFloat(productlist[i].price));
jsonstr.totalAmount=accAdd(jsonstr.totalAmount, accSub(accMul(num, productlist[i].price), accMul(productlist[i].num, productlist[i].price)));
productlist[i].num=parseInt(num);
orderdetail.totalNumber = jsonstr.totalNumber;
orderdetail.totalAmount = jsonstr.totalAmount;
utils.setParam("ShoppingCart","'"+JSON.stringify(jsonstr));
return;
}
}
},
//获取购物车中的所有商品
getproductlist:function(){
var ShoppingCart = utils.getParam("ShoppingCart");
if (!ShoppingCart) {
return null;
}
var jsonstr = JSON.parse(ShoppingCart.substr(1,ShoppingCart.length));
var productlist = jsonstr.productlist;
orderdetail.totalNumber = jsonstr.totalNumber;
orderdetail.totalAmount = jsonstr.totalAmount;
return productlist;
},
//获取整个购物车
getshopcart:function(){
var ShoppingCart = utils.getParam("ShoppingCart");
return ShoppingCart;
},
//判断购物车中是否存在商品
existproduct:function(id){
var ShoppingCart = utils.getParam("ShoppingCart");
var jsonstr = JSON.parse(ShoppingCart.substr(1,ShoppingCart.length));
var productlist = jsonstr.productlist;
var result=false;
for(var i in productlist){
if(productlist[i].id==id){
result = true;
}
}
return result;
},
// 通过id获取商品
getproductbyid:function(id) {
var ShoppingCart = utils.getParam("ShoppingCart");
var jsonstr = JSON.parse(ShoppingCart.substr(1,ShoppingCart.length));
var productlist = jsonstr.productlist;
var result=false;
for(var i in productlist){
if(productlist[i].id==id){
return productlist[i];
}
}
return null;
},
//删除购物车中商品
deleteproduct:function(id){
var ShoppingCart = utils.getParam("ShoppingCart");
var jsonstr = JSON.parse(ShoppingCart.substr(1,ShoppingCart.length));
var productlist = jsonstr.productlist;
var list=[];
for(var i in productlist){
if(productlist[i].id==id){
jsonstr.totalNumber=parseInt(jsonstr.totalNumber)-parseInt(productlist[i].num);
// jsonstr.totalAmount=parseFloat(jsonstr.totalAmount)-parseInt(productlist[i].num)*parseFloat(productlist[i].price);
jsonstr.totalAmount=addSub(jsonstr.totalAmount, accMul(productlist[i].num, productlist[i].price));
}else{
list.push(productlist[i]);
}
}
jsonstr.productlist = list;
orderdetail.totalNumber = jsonstr.totalNumber;
orderdetail.totalAmount = jsonstr.totalAmount;
utils.setParam("ShoppingCart","'"+JSON.stringify(jsonstr));
},
//清空购物车
clear:function(){
utils.setParam("ShoppingCart", "");
}
};
|
|