我正试图弄清楚如何允许每个十进制数只有一个小数点。当用户输入他的方程时,我可以只允许输出1个小数点,但我不知道如何允许用户在屏幕上输入多个小数点时输入一个小数点。此时,我的代码只允许屏幕上显示1个小数点。如何更改此设置,使其适用于所有数字,而不会在不正确的位置添加小数点?
zf2sa74q1#
我假设这是一个字符串,你正在试图操作。例如“10. 5 +6* 7. 0”。我将假设你正在存储用户输入在一个字符串构建器。每次用户输入字符时,您都会将其附加到StringBuilder中。始终跟踪字符串中最右边的“数字分隔符”。分隔符示例:+-*/%()[]。您知道当前键入的数字从最右边的分隔符之后开始。请检查从分隔符到字符串长度的字符,以查看数字中是否已有小数。
import java.util.*; import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; import javax.script.ScriptException; class Foo { int rightmostDelimiterIdx = 0; List<Character> delimiters = Arrays.asList('+', '-', '*', '/', '%', '(', ')', '[', ']'); public static void main(String[] args){ Foo foo = new Foo(); try { foo.run(); } catch (ScriptException e) { e.printStackTrace(); } } public void run() throws ScriptException { StringBuilder sb = new StringBuilder(); // store user input ScriptEngineManager mgr = new ScriptEngineManager(); // evaluate expression with JavaScript ScriptEngine engine = mgr.getEngineByName("JavaScript"); // User types:5.0*7 charTyped(sb, '5'); charTyped(sb,'.'); charTyped(sb,'0'); charTyped(sb,'*'); charTyped(sb,'7'); System.out.println(engine.eval(sb.toString())); sb.setLength(0); // User types:8+2.3.3 charTyped(sb, '8'); charTyped(sb,'+'); charTyped(sb,'2'); charTyped(sb,'.'); charTyped(sb,'3'); charTyped(sb,'.'); // second decimal will be rejected, thus string will be "8+2.33" charTyped(sb,'3'); System.out.println(engine.eval(sb.toString())); } // appends c to sb if valid operation public void charTyped(StringBuilder sb, char c) { if(delimiters.contains(c)) { rightmostDelimiterIdx = sb.length(); } else if(c == '.' && sb.indexOf(".", rightmostDelimiterIdx) != -1) { return; // do not add '.' b/c already exists in number } sb.append(c); } public void charDeleted(StringBuilder sb, char c) { // I leave implementation up to you } }
输出:35.010.33
1条答案
按热度按时间zf2sa74q1#
我假设这是一个字符串,你正在试图操作。例如“10. 5 +6* 7. 0”。我将假设你正在存储用户输入在一个字符串构建器。
每次用户输入字符时,您都会将其附加到StringBuilder中。始终跟踪字符串中最右边的“数字分隔符”。分隔符示例:+-*/%()[]。您知道当前键入的数字从最右边的分隔符之后开始。请检查从分隔符到字符串长度的字符,以查看数字中是否已有小数。
输出:
35.0
10.33