Paul McFedries' Web Home


Calculating Order Form Totals


The script on this page displays a running total for an order form. Each time the user changes the quantity they want to order, the TOTAL field is updated automatically. Give it a whirl:

YEAST FREE BREADS AND BAGELS

WHEAT ALTERNATIVES-yeast-free, fat-free*
Please
enter
quantity:
DescriptionPrice
(each)
Spelt Bread 24 oz$4.99
Spelt Multi-Grain Bread* 24 oz$4.99
Spelt Cinnamon-Raisin Bread 24 oz$4.99
Spelt White Bread* 18 oz$3.99
Spelt White Multi-Grain Bread* with Flax Seeds 18 oz$3.99
Rye Bread (Wheat Free, not sliced) 24 oz$4.99
Kamut® Bread 24 oz$4.99
Kamut Cinnamon-Raisin Bread 24 oz$4.50
Kamut Almond-Raisin Bread* 24 oz$4.99
Ancient Grains Bread 18 oz NEW!$2.99

TOTAL


Here's what you have to do to get things to work:
  1. Set up a special NAME for each item. Here's the general format to use

    PROD_ProductID_Price

    Here, ProductID is a unique ID code that enables you to determine which product the customer ordered, and Price is the price of the item (without the dollar sign). Here's an example for a product with the code "SP" and a price of $4.99:

    PROD_SP_4.99

  2. For each TEXT box, add the following:

    onChange="CalculateTotal(this.form)"

    Here's an example TEXT box tag:

    <INPUT TYPE=TEXT NAME="PROD_SP_4.99" onChange="CalculateTotal(this.form)">

  3. Add a TOTAL field at the end of the form. Name this field "TOTAL", like so

    <INPUT TYPE=TEXT NAME=TOTAL SIZE=10 onFocus="this.form.elements[0].focus()">

    This field will display the total. Note, too, that the onFocus event is used to ensure that the user can't edit the field.

  4. Add the following JavaScript code within the header section (that is between the <HEAD> and </HEAD> tags) of your page:
<script language="JavaScript" type="text/javascript">
<!--

/* This script is Copyright (c) Paul McFedries and 
Logophilia Limited (http://www.mcfedries.com/).
Permission is granted to use this script as long as 
this Copyright notice remains in place.*/

function CalculateTotal(frm) {
    var order_total = 0

    // Run through all the form fields
    for (var i=0; i < frm.elements.length; ++i) {

        // Get the current field
        form_field = frm.elements[i]

        // Get the field's name
        form_name = form_field.name

        // Is it a "product" field?
        if (form_name.substring(0,4) == "PROD") {

            // If so, extract the price from the name
            item_price = parseFloat(form_name.substring(form_name.lastIndexOf("_") + 1))

            // Get the quantity
            item_quantity = parseInt(form_field.value)

            // Update the order total
            if (item_quantity >= 0) {
                order_total += item_quantity * item_price
            }
        }
    }

    // Display the total rounded to two decimal places
    frm.TOTAL.value = round_decimals(order_total, 2)
}

function round_decimals(original_number, decimals) {
    var result1 = original_number * Math.pow(10, decimals)
    var result2 = Math.round(result1)
    var result3 = result2 / Math.pow(10, decimals)
    return pad_with_zeros(result3, decimals)
}

function pad_with_zeros(rounded_value, decimal_places) {

    // Convert the number to a string
    var value_string = rounded_value.toString()
    
    // Locate the decimal point
    var decimal_location = value_string.indexOf(".")

    // Is there a decimal point?
    if (decimal_location == -1) {
        
        // If no, then all decimal places will be padded with 0s
        decimal_part_length = 0
        
        // If decimal_places is greater than zero, tack on a decimal point
        value_string += decimal_places > 0 ? "." : ""
    }
    else {

        // If yes, then only the extra decimal places will be padded with 0s
        decimal_part_length = value_string.length - decimal_location - 1
    }
    
    // Calculate the number of decimal places that need to be padded with 0s
    var pad_total = decimal_places - decimal_part_length
    
    if (pad_total > 0) {
        
        // Pad the string with 0s
        for (var counter = 1; counter <= pad_total; counter++) 
            value_string += "0"
        }
    return value_string
}

//-->
</script>

Copyright © 1995 - 2014 Paul McFedries and Logophilia Limited