SitePoint Sponsor

User Tag List

Results 1 to 2 of 2
  1. #1
    SitePoint Enthusiast
    Join Date
    Nov 2006
    Posts
    30
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Calculate subtotals, totals and postage

    Hi All,

    Wondering if anyone can help me out with modifying the below script:

    Code:
    <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>
    I got the script from this url:

    http://www.mcfedries.com/JavaScript/OrderTotals.asp to see in action.

    I need to modify it so that:
    it will also calculate totals for individual product items as well as the total &

    And also a postage value which is based on the total order quantities i.e. first item = $7, then $1 for each item after that.

    Any help would be much appreciated.

    Thank you.

  2. #2
    SitePoint Enthusiast
    Join Date
    Nov 2006
    Posts
    30
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    So have got handling and grand total covered but wondering if there is an easy way to get individual item totals still...

    Code:
    <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
    	var handling = 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
    				handling += item_quantity * 1
                }
            }
        }
    	
        // Display the total rounded to two decimal places
        frm.TOTAL.value = round_decimals(order_total, 2)
    	//Calculate handling and display
    	handling = handling + 7
    	frm.HANDLING.value = round_decimals(handling, 2)
    	//Calculate grand total and display
    	total_2 = order_total + handling
    	frm.TOTAL2.value = round_decimals(total_2, 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>


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •