You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算器应用中字符串连续数字转数值格式的问题求助

解决计算器应用中多位数数字的识别问题

看起来你遇到了计算器逻辑里的典型问题:当前代码会把输入字符串中的数字按单个字符拆分处理,导致像30这样的多位数被拆成3.0和0.0两个独立元素压入栈,而不是识别为一个完整的数字。下面是具体的分析和修复方案:

问题根源

你的原代码将输入字符串按单个字符拆分后推入stringStack,然后每次只取出栈顶的单个字符判断是否为数字。这种方式完全忽略了连续数字字符属于同一个多位数的情况,自然会把多位数拆分开。

修复方案

我们需要修改逻辑,当遇到数字字符时,持续读取所有连续的数字字符(如果需要支持小数,还可以包含小数点),拼接成完整的数字字符串后再转换为Double压入栈。同时可以优化掉stringStack,直接遍历原字符串会更高效:

修改后的CalcLogic类代码

public class CalcLogic {
    private CharacterStack characterStack;
    private DigitStack digitStack;

    public CalcLogic() {
        characterStack = new CharacterStack();
        digitStack = new DigitStack();
    }

    public void convertString(String s) {
        int index = 0;
        int strLength = s.length();
        
        while (index < strLength) {
            char currentChar = s.charAt(index);
            
            // 处理数字(支持整数和小数)
            if (Character.isDigit(currentChar) || currentChar == '.') {
                StringBuilder numStrBuilder = new StringBuilder();
                // 连续读取所有数字/小数点字符
                while (index < strLength && (Character.isDigit(s.charAt(index)) || s.charAt(index) == '.')) {
                    numStrBuilder.append(s.charAt(index));
                    index++;
                }
                // 转换为Double并压入数字栈
                digitStack.push(Double.parseDouble(numStrBuilder.toString()));
            } 
            // 处理运算符和括号
            else if ("(+=*-/^)".indexOf(currentChar) != -1) {
                characterStack.push(currentChar);
                index++;
            } 
            // 跳过无关字符(比如空格)
            else {
                index++;
            }
        }
        
        System.out.println(digitStack);
        System.out.println(characterStack);
    }
}

关键改进点

  • 移除stringStack:直接遍历原字符串,避免额外的栈操作开销,也更便于处理连续字符
  • 连续数字拼接:用StringBuilder收集所有连续的数字/小数点字符,确保多位数被识别为一个整体
  • 高效字符判断:用indexOf替代正则表达式判断运算符/括号,性能更优
  • 支持小数扩展:如果你的计算器不需要处理小数,只需去掉代码中关于小数点的判断即可

测试效果

当你输入字符串"1+2*3*(30+4/2-(10+2))*2+1"(修正了你原输入中可能的笔误3(30为3*(30),digitStack会正确输出包含30.0和10.0的结果,符合你的预期:1.0 2.0 3.0 30.0 4.0 2.0 10.0 2.0 2.0 1.0(具体顺序取决于你的栈实现的输出格式)

内容的提问来源于stack exchange,提问作者Dartweiler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:12:49