1. 程式人生 > >計算字串中的簡單數學公式

計算字串中的簡單數學公式

今天公司產品提出需求。需要把計算公式放到伺服器,然後伺服器可動態化配置。所以找尋各種資料從而由此方法

程式碼如下:

public static double eval(final String str) {
return new Object() {
int pos = -1, ch;


void nextChar() {
ch = (++pos < str.length()) ? str.charAt(pos) : -1;
}


boolean eat(int charToEat) {
while (ch == ' ')
nextChar();
if (ch == charToEat) {
nextChar();
return true;
}
return false;
}


double parse() {
nextChar();
double x = parseExpression();
if (pos < str.length())
throw new RuntimeException("Unexpected: " + (char) ch);
return x;
}


double parseExpression() {
double x = parseTerm();
for (;;) {
if (eat('+'))
x += parseTerm(); // addition
else if (eat('-'))
x -= parseTerm(); // subtraction
else
return x;
}
}


double parseTerm() {
double x = parseFactor();
for (;;) {
if (eat('*'))
x *= parseFactor(); // multiplication
else if (eat('/'))
x /= parseFactor(); // division
else
return x;
}
}


double parseFactor() {
if (eat('+'))
return parseFactor(); // unary plus
if (eat('-'))
return -parseFactor(); // unary minus


double x;
int startPos = this.pos;
if (eat('(')) { // parentheses
x = parseExpression();
eat(')');
} else if ((ch >= '0' && ch <= '9') || ch == '.') { // numbers
while ((ch >= '0' && ch <= '9') || ch == '.')
nextChar();
x = Double.parseDouble(str.substring(startPos, this.pos));
} else if (ch >= 'a' && ch <= 'z') { // functions
while (ch >= 'a' && ch <= 'z')
nextChar();
String func = str.substring(startPos, this.pos);
x = parseFactor();
if (func.equals("sqrt"))
x = Math.sqrt(x);
else if (func.equals("sin"))
x = Math.sin(Math.toRadians(x));
else if (func.equals("cos"))
x = Math.cos(Math.toRadians(x));
else if (func.equals("tan"))
x = Math.tan(Math.toRadians(x));
else
throw new RuntimeException("Unknown function: " + func);
} else {
throw new RuntimeException("Unexpected: " + (char) ch);
}


if (eat('^'))
x = Math.pow(x, parseFactor()); // exponentiation


return x;
}
}.parse();
}

例子:

String gs = "100*5*0.003";

System.out.println(eval(gs));

相關推薦

計算字串簡單數學公式

今天公司產品提出需求。需要把計算公式放到伺服器,然後伺服器可動態化配置。所以找尋各種資料從而由此方法 程式碼如下: public static double eval(final String str) {return new Object() {int pos = -1,

[Swift通天遁地]五、高階擴充套件-(14)擴充套件String快速計算字串的各種數學表示式

本文將演示快速計算字串中的各種數學表示式。 Gihub專案:【DDMathParser】 下載並解壓該專案。將資料夾【MathParser】算術解析包,拖動到自己的專案中。 點選【Finish】完成檔案拖動。 在匯入的專案中,【MathParser】->【Info.plist】資訊列表上滑鼠右鍵

如何用在Typora新增數學公式?

文章目錄 0.新增公式 1.算式 1.1 分式 1.2 根式 1.3 上下標 1.4 向量 1.5 均值 1.6 極限

Python基礎訓練題-簡單數學公式

1.在100內,將遇到被7除餘數為0的都顯示PASS: 1 n=1 2 while n < 101: 3 if n % 7 == 0: 4 pass 5 print('pass') 6 else: 7 print(n) 8

計算字串有多少個整數

計算使用者輸入內容中有多少個整數(以個位數為單位) content = input('請輸入一段內容:').strip() # 對輸入的內容進行去空格操作 雖然沒啥必要 count = 0 # 使用count來對出現次數計數 for i in content: # 對字串進行遍歷

LightOJ - 1163 Bank Robbery 簡單數學公式

題意: 原來有個數A,去掉他的最後一位 x 後,得到 AA,然後 A - AA = B; 給定 B ,要求 A; 思路: 根據條件可以得到:A  - (A / 10)=  B;&nbs

在Markdown輸入數學公式(MathJax)

   ColdRomantic  關注 2017.06.25 19:46* 字數 435 閱讀 21462評論 6喜歡 39 1 基本語法 1.1 呈現位置 正文(inline)中的LaTeX公式用$...$定

在Microsoft Word輸入數學公式(待完善)

    主要是在機器學習過程中使用到的一些公式     在one note 中 使用“Alt”+“=”即可鍵入公式      Microsoft公式 符號 對應於LATEX不同的公式 \doubleR  \mathbb{R}

計算字串每個字元出現的次數

var str="Hello World" function calc(str){ var hash=[]; for(var i=0;i<str.length;i++){ var key=str[i]; if(hash[k

Python 計算字串所有數字的和,如:'12abc34de5f' => 12 + 34 + 5 => 51

Python 計算字串中所有數字的和,如:‘12abc34de5f’ => 12 + 34 + 5 => 51 解題思路: 可以把不是數字的元素轉換成’ '空格, 然後按空格切割成列表, 把列表中的數字元素找出相加 最後返回 s = '12abc34de5f' def sum

計算字串含有的某個字元的個數

有如下方法: String testString = "a,b,c,d" 1)using apache commons int apache = StringUtils.countMatch

markdown tex 數學公式和字元表示方法

上下標 上標符號為“^”、下標符號為“_” , 2^r , a_5 可同時輸入上下標(注意要先下標再上標) C_n^m 分式 簡單的可以用單斜槓 / 表示分數線

markdown數學公式簡要

在CSDN的部落格開始支援Markdown編輯器後,自己完全轉向了markdown編輯器。 Markdown的語法簡潔明瞭、學習容易,而且功能比純文字更強,因此用它寫部落格非常方便,還可以輕鬆的匯出PDF或者HTML的檔案。github上的wiki,各個pro

java使用charAt()方法計算字串的重複字元

charAt()方法介紹 charAt() 方法用於返回指定索引處的字元。索引範圍為從 0 到 length() - 1。 例如:str.next().charAt(0);//獲取字串str中的第1個字元 str.next().charAt(9);//獲

計算字串的指定的子串出現的次數

public class Test_String2 { public static void main(String[] args) { String s="abddabsscabdablab"; int count=0; int index=-1; //用於標識字元的下標位置

java計算字串的大寫字母、小寫字母和非字母的個數

效果如圖: 程式碼如下: import java.util.Scanner; public class Test_String1 { public static void main(String[] args) { System.out.println("請輸入字串:");

3分鐘教會你用mathjax在csdn部落格編輯數學公式

一、Mathjax簡介 MathJax是一個JavaScript引擎,用來顯示網路上的數學公式, MathJax有兩種插入公式的方式:一種是行中公式,另外一種是獨立公式,行中公式可以插入到一行文字中,獨立公式是單獨成行,行中公式插入方式是:$…$,獨立公式插入

#計算字串所有數字和,連續當一個數字 (正則表示式,能不用就不用)

s='12as3d6f20ads01sd02' import re def he(s): c=re.compile('\d+')#建立正則表示式 l=c.findall(s)#返回所有匹配結果的列表 sum=0 #和 for i in l: #遍歷

java執行字串的運算公式

public class runString { static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript"); public stat

編寫一個函式,計算字串含有的不同字元的個數。字元在ACSII碼範圍內(0~127)。不在範圍內的不作統計。

輸入描述: 輸入N個字元,字元在ACSII碼範圍內。 輸出描述: 輸出範圍在(0~127)字元的個數import java.util.*; public class Main {     public static void main(String[] args) {