C# ASP.NET MVC计算发货总额
如何计算html中的发货总额。第一件商品的运费为3.99美元,每增加一件商品的运费为0.99美元C# ASP.NET MVC计算发货总额,c#,asp.net-mvc,C#,Asp.net Mvc,如何计算html中的发货总额。第一件商品的运费为3.99美元,每增加一件商品的运费为0.99美元 @{ double itemTotal = 0; double subTotal = 0; int totalQty = 0; double discount = 0.8; double shippingBase = 3.99; double shippingItem = 0.99; } @foreach (var item
@{
double itemTotal = 0;
double subTotal = 0;
int totalQty = 0;
double discount = 0.8;
double shippingBase = 3.99;
double shippingItem = 0.99;
}
@foreach (var item in Model)
{
double price = (double)item.price / 100 * discount;
itemTotal = @item.qty * price;
subTotal += itemTotal;
totalQty += @item.qty;
您可以向循环中添加一个简单的条件和添加:
@{
double itemTotal = 0;
double subTotal = 0;
int totalQty = 0;
double discount = 0.8;
double shippingBase = 3.99;
double shippingItem = 0.99;
double totalShipping = 0; //used to calculate the cumulative shipping total
}
@foreach (var item in Model)
{
double price = (double)item.price / 100 * discount;
itemTotal = @item.qty * price;
subTotal += itemTotal;
totalQty += @item.qty;
totalShipping += ((totalShipping >= shippingBase) ? shippingItem : shippingBase);
}
使用此语句
第一件商品的运费为3.99美元,每件为0.99美元
附加项目
提取以下数据以创建运费模型
public class ShippingCharge {
public decimal basePrice { get; set; }
public int baseCount { get; set; }
public decimal unitPrice { get; set; }
}
使用OP中的示例将填充为
//Shipping charges are
shippingCharge = new ShippingCharge() {
// $3.99
basePrice = 3.99M,
//for the first item
baseCount = 1,
// $.99 for each additional item.
unitPrice = 0.99M
};
完成后,使用以下算法计算给定项目计数的运费
decimal? CalculateShippingTotal(int itemCount, ShippingCharge charge) {
decimal? total = null;
if (charge != null) {
var basePrice = charge.basePrice;
var baseCount = charge.baseCount;
if (itemCount > baseCount) {
var qtyDifference = itemCount - baseCount;
var additionalCost = qtyDifference * charge.unitPrice;
total = basePrice + additionalCost;
} else {
total = itemCount * basePrice;
}
}
return total;
}
以下单元测试验证了计算总运费的算法的正确性
[TestMethod]
public void _TotalShipping_For_One_Item() {
//Arrange
var totalQty = 1;
var expected = 3.99M;
//Act
var actual = CalculateShippingTotal(totalQty, shippingCharge);
//Assert
actual.ShouldBeEquivalentTo(expected);
}
[TestMethod]
public void _TotalShipping_For_Two_Items() {
//Arrange
var totalQty = 2;
var expected = 4.98M;
//Act
var actual = CalculateShippingTotal(totalQty, shippingCharge);
//Assert
actual.ShouldBeEquivalentTo(expected);
}
[TestMethod]
public void _TotalShipping_For_Three_Items() {
//Arrange
var totalQty = 3;
var expected = 5.97M;
//Act
var actual = CalculateShippingTotal(totalQty, shippingCharge);
//Assert
actual.ShouldBeEquivalentTo(expected);
}
这个答案的具体目标是如何根据OP而不是折扣小计来计算运输成本。这应该足够简单,你可以通过清点物品、数量和价格来计算。完成后,使用项目计数和费用来计算运输成本。我对这句话感到困惑:totalShipping+=totalShipping>shippingBase?shippingItem:shippingBase;这是一个“三级操作符”:。它本质上类似于“如果”语句,但更简洁。在本例中,循环中的每个迭代(对于每个项目),“某物”被添加到
totalShipping
。如果totalShipping
小于3.99
(这表明这是第一次通过循环),则3.99
将添加到totalShipping
。如果totalShipping
大于3.99
(第一个项目之后的每个附加项目),那么shippingItem
(0.99
)将添加到totalShipping
。好的,我尝试过测试它,但当它是第二个项目hmmm时,它没有添加0.99,我想知道这是否是一个操作顺序问题。它是否在第二次添加任何内容?您可以尝试将该表达式放在括号中。检查我的更新答案。你知道吗,我认为需要大于或等于,而不仅仅是大于。再次检查我的更新答案。很抱歉。FIY你可能想考虑把它从你的视图中移入视图模型。这是一条业务规则,因此将其绑定到视图中意味着您只能使用该视图。您可以使用视图帮助器,但由于这是一条业务规则,因此它可能属于模型中的一个方法或单独的业务逻辑类/等。然后,控制器可以通过提供所需的精确值来构建视图模型,并且视图模型可以只显示其中的内容,而无需进行类似的计算。只是一个建议。