---
title: Line item calculator
slug: commerce-connect-15/docs/line-item-calculator
docTags: 
createdAt: 2026-07-30T20:34:42.000Z
---

## extendedPrice

Calculates the price including the order-level discount amount (spread over all line items in the shipment) and any line item discount amount.

```csharp
public void GetExtendedPrice(ILineItem lineItem, Currency currency, ILineItemCalculator lineItemCalculator) {
  var extendedPrice = lineItemCalculator.GetExtendedPrice(lineItem, currency);
  Debug.WriteLine("Extended price for '{0}': {1}", lineItem.Code, extendedPrice);
}
```

## discountedPrice

Calculates the price with only the line item discount amount — that is, the discount for a specific line item.

```csharp
public void GetDiscountedPrice(ILineItem lineItem, Currency currency, ILineItemCalculator lineItemCalculator) {
  var discountedPrice = lineItemCalculator.GetDiscountedPrice(lineItem, currency);
  Debug.WriteLine("Discounted price for '{0}': {1}", lineItem.Code, discountedPrice);
}
```

## lineItemPrices

Calculates the line item prices — both the extended price and the discounted price for the line item.

```csharp
public void GetLineItemPrices(ILineItem lineItem, Currency currency, ILineItemCalculator lineItemCalculator) {
  var lineItemPrices = lineItemCalculator.GetLineItemPrices(lineItem, currency);
  Debug.WriteLine("Extended price for '{0}': {1}", lineItem.Code, lineItemPrices.ExtendedPrice);
  Debug.WriteLine("Discounted price for '{0}': {1}", lineItem.Code, lineItemPrices.DiscountedPrice);
}
```

## salesTax

The `GetSalesTax` method has two overloads — one for a single line item and one for a collection.

For a single line item:

```csharp
public void GetSalesTax(ILineItem lineItem, IMarket market, Currency currency, IOrderAddress shippingAddress, ILineItemCalculator lineItemCalculator) {
  var salesTax = lineItemCalculator.GetSalesTax(lineItem, market, currency, shippingAddress);
  Debug.WriteLine("Sales tax for '{0}': {1}", lineItem.Code, salesTax);
}
```

For a collection of line items:

```csharp
public Money GetSalesTax(IEnumerable<ILineItem> lineItems, IMarket market, Currency currency, IOrderAddress shippingAddress, ILineItemCalculator lineItemCalculator) {
  return lineItemCalculator.GetSalesTax(lineItems, market, currency, shippingAddress);
}
```

## Change the default calculation

Inherit from `DefaultLineItemCalculator`, the default implementation of `ILineItemCalculator`, to override the extended price and sales tax calculations. To change the calculation of a line item's extended price, override the `CalculateExtendedPrice` method. To change the calculation of a line item's sales tax, override the `CalculateSalesTax` method.

```csharp
public class LineItemCalculatorSample: DefaultLineItemCalculator {
  protected override Money CalculateExtendedPrice(ILineItem lineItem, Currency currency) {
    return new Money(0, currency);
  }

  protected override Money CalculateSalesTax(ILineItem lineItem, IMarket market, Currency currency, IOrderAddress shippingAddress) {
    return new Money(0, currency);
  }
}
```

## Change the default validation

The default implementation validates that the extended price and sales tax are non-negative after calculation. To change the behavior, override the `ValidateExtendedPrice` and `ValidateSalesTax` methods.

```csharp
public class LineItemCalculatorSample: DefaultLineItemCalculator {
  protected override void ValidateExtendedPrice(Money money) {
    if (money.Amount < 0) {
      throw new ValidationException("Extended price must not be negative.");
    }
  }

  protected override void ValidateSalesTax(Money money) {
    if (money.Amount < 0) {
      throw new ValidationException("Sales tax must not be negative.");
    }
  }
}
```
