添加从javascript字符串中提取的数字

添加从javascript字符串中提取的数字,javascript,Javascript,我是javascript新手,正在尝试用javascript为我的网站(纸杯蛋糕店网站)创建一个简单的价格计算器。首先,我让用户从口味选择列表中进行选择,并将其发布到文本区域,当用户选择纯素口味时,我会在发布到文本区域时在末尾添加3.50美元,当用户选择非纯素口味时,价格为2.75美元。发布到文本区域的所有内容都是字符串。因此,对于计算器,我提取最后5个字符(即价格),并将它们相加得到小计。我使用了一个循环来遍历文本区域中的列表,一个接一个地提取数字并将它们相加,但是,计算结果是错误的。谁能告诉

我是javascript新手,正在尝试用javascript为我的网站(纸杯蛋糕店网站)创建一个简单的价格计算器。首先,我让用户从口味选择列表中进行选择,并将其发布到文本区域,当用户选择纯素口味时,我会在发布到文本区域时在末尾添加3.50美元,当用户选择非纯素口味时,价格为2.75美元。发布到文本区域的所有内容都是字符串。因此,对于计算器,我提取最后5个字符(即价格),并将它们相加得到小计。我使用了一个循环来遍历文本区域中的列表,一个接一个地提取数字并将它们相加,但是,计算结果是错误的。谁能告诉我它有什么问题吗

function addOption(selectbox,text,value )
{
var optn = document.createElement("OPTION");
optn.text = text;
optn.value = value;
selectbox.options.add(optn);
}

function addOption_list(selectbox){
var flavors = new Array("blueberry vegan","butterscotch","cappuccino vegan","carrot     
cake","carrot vegan","chocolate walnut vegan",
"chocolate peanut butter vegan","green tea & chocolate","keylime","lavender     
vegan","lemon","lemon cream vegan","mandarin orange",
"mint chocolate","mocha","peanut butter & double chocolate","raspberry swirl","red   
velvet","sesame","sesame oreo",
"strawberry","strawberry 2 vegan","tangerine","thia tea","triple   
chocolate","vanilla","very berry","vietnamese coffee","yuzu");
for (var i=0; i < flavors.length;++i){

addOption(document.drop_list.flavors_list, flavors[i], flavors[i]);
}
}

var $ = function (id){
return document.getElementById(id);
}

var cart = [];
var update_cart = function(){
if(cart.length == 0){
    $("flavor_name").value = "";
} else{
    var list = "";
    for(var i in cart){ 
        list += (parseInt(i) +1) + ". " + cart[i] + /*":  $3.50" + */ "\n"; 
    }
    $("flavor_name").value = list;


    var sum = 0;
    for(var i = 0; i < cart.length; i++){
        var price = parseFloat(list.substring(list.length - 5));
        sum += parseFloat( price.toFixed(2) );
    }

    $("subtotal").value = sum;
    var tax = parseFloat(($("subtotal").value * .08875).toFixed(2));
    $("sales_tax").value = tax;

    var total = parseFloat(price + tax).toFixed(2);
    $("total").value = total;

    }
}




var selectDropdown = function(){
    var dropdownValue=document.getElementById("flavors_list").value;
   // alert("You selected : " + dropdownValue);


if(dropdownValue == "blueberry vegan" || dropdownValue == "cappuccino vegan" ||   
       dropdownValue == "carrot vegan" || dropdownValue == "carrot vegan" ||
   dropdownValue == "chocolate walnut vegan" || dropdownValue == "chocolate peanut   
       butter vegan" || dropdownValue == "lavender vegan" || dropdownValue == "lemon   
       cream vegan" || dropdownValue == "strawberry 2 vegan"){
    alert("Adding " + dropdownValue + " to cart.");
    cart[cart.length] = dropdownValue + ":  $3.25";
    update_cart();
} else{
    alert("Adding " + dropdownValue + " to cart.");
    cart[cart.length] = dropdownValue + ":  $2.75";
    update_cart();
} 
}
功能添加选项(选择框、文本、值)
{
var optn=document.createElement(“选项”);
optn.text=文本;
optn.value=值;
选择框。选项。添加(optn);
}
功能添加选项列表(选择框){
var flavors=新数组(“蓝莓素食”、“奶油糖果”、“卡布奇诺素食”、“胡萝卜”
蛋糕、胡萝卜素食主义者、巧克力核桃素食主义者、,
“巧克力花生酱素食主义者”、“绿茶与巧克力”、“酸橙”、“薰衣草”
“纯素”、“柠檬”、“柠檬奶油纯素”、“橘子”,
“薄荷巧克力”、“摩卡”、“花生酱双巧克力”、“覆盆子漩涡”、“红色”
丝绒、芝麻、芝麻奥利奥、,
“草莓”,“草莓2素”,“橘子”,“茶”,“三重”
巧克力、香草、浆果、越南咖啡、玉足);
对于(变量i=0;i<0.length;++i){
添加选项(document.drop_list.flavors_list,flavors[i],flavors[i]);
}
}
var$=函数(id){
返回文档.getElementById(id);
}
var-cart=[];
var update_cart=函数(){
如果(cart.length==0){
$(“风味名称”)。值=”;
}否则{
var list=“”;
对于(cart中的var i){
list+=(parseInt(i)+1)+“+cart[i]+/*”:$3.50”+*/“\n”;
}
$(“风味名称”)。值=列表;
var总和=0;
对于(变量i=0;i
HTML:


家庭小甜心纸杯蛋糕
物价计算器

要下订单,请从 下拉列表:

口味表 小计:
销售税:
总计:

提前感谢

我在您的代码中看到了多个问题,但是如果没有一个工作示例来查看实际的HTML和值,很难确定所有问题都是什么。以下是一些问题:

  • parseInt()
    应始终传递第二个参数(基数),否则它将根据内容猜测基数
  • 决不能使用(a中的x)
    来迭代数组的内容。除了数组元素之外,还可以包括添加到数组中的属性。对于(var i=0;i要安全得多
  • 浮点数学不是完美的,所以如果你想要完美的金融数学,你应该把所有的东西都转换成美分,然后做整数数学
  • 无论是
    parseInt()
    还是
    parseFloat()
    都不允许字符串中出现
    $
    ,因此必须先删除这些字符串
  • 当使用for循环迭代数组时,递增的索引只是数组中的索引。您必须实际进入数组并获取每个值
  • 在这段代码中,不清楚要迭代什么。每次通过
    for
    循环都使用与
    list
    相同的值。它不是迭代数组

    for(var i = 0; i < cart.length; i++){
        var price = parseFloat(list.substring(list.length - 5));
        sum += parseFloat( price.toFixed(2) );
    }
    
    您应该使用for循环和计数变量,如下所示。附加好处:无需
    parseInt

    我提取最后5个字符(即价格)并将它们相加,得到小计:

    另外,您不应该使用
    parseFloat(price.toFixed(2))。除了一些IE错误外,浮点数学永远不会可靠,并且在不断取整时也不会变得更好。取而代之的是用整数分计算(虽然JS技术上没有整数):


    如果您使用创建一个示例,我很乐意帮助您不要使用
    for in
    循环来迭代
    购物车。这是一个数组,在JS中迭代数组的正确方法是for(var n=0;n向我们展示实际的HTML,我们可以更好地帮助您了解如何求和您试图求和的值。第8行:
    parseInt(i)
    -->哦,不,没有人会这么做。这是
    parseInt(i,10)
    更好。你想对HTML中的哪些字段求和?我认为他不会在他的
    parseFloat
    中出错:strin
    for(var i = 0; i < cart.length; i++){
        var price = parseFloat(list.substring(list.length - 5));
        sum += parseFloat( price.toFixed(2) );
    }
    
    function getNumber(str) {
        var matches = str.match(/([\d\.]+)\s*$/)
        if (matches) {
            return (+matches[1]);
        }
        return(0);
    }
    
    var str = "xxx $99.45\n";
    var num = getNumber(str);
    
    for(var i in cart)
    
    for(var i = 0; i < cart.length; i++){
        var price = parseFloat(list.substring(list.length - 5));
        sum += parseFloat( price.toFixed(2) );
    }
    
    for (var i=0; i<cart.length; i++) {
        var price = parseFloat(cart[i].substring(1));
        sum += price;
    }
    
    var price = Math.floor(parseFloat(str, 10) * 100);