Create a simple math calculator +-/* accepting only Chinese characters The task:
Build a calculator that takes a simple math equation in Chinese and outputs the correct answer(To the equation from the users input) in Chinese.



Scope:


Any programming language can be used.
Input must be in Chinese otherwise an error message will be displayed .
Output must be in Chinese.
Only input and output of whole numbers between 0-999 will be in scope (this is meant to be a simple calcaulation).
The full original input must be included prior to equals then the answer.
Display answer with no decimal points.
Long number form output is mandatory.
Input must accept Long number form, inclusion of short form is optional.


Sample input/output:


  二乘以八  (2*8)
  二乘以八等于十六 (2*8=16)


Cheat Sheet:


  零 or 〇 → 0 (either form or both, you choose)
  一 → 1
  二 → 2
  三 → 3
  四 → 4
  五 → 5
  六 → 6
  七 → 7
  八 → 8
  九 → 9
  十 → 10
  百 → 100
  加 → + Operator
  减 → - Operator
  乘以 → * Operator
  除以 → / Operator
  等于 → = Operator  
  
  Chinese numbering is basic 333 is just 3 100 3 10 3 三百三十三 only exception is 十 where you don't need 一十 to say 10 (but you might to), but you do need 一百 to say 100 (i.e., can't say just 百).


Useful link: http://www.mandarintools.com/numbers.html

If you can't see the chinese symbols, you may see them here.

Get creative and happy coding!
Java

It parses the equation as a context-free language, using these productions for that:

U1 = [一-九]                 (i.e. [1-9])
D1 = U1 十 U1?
DO = U1? 十 U1?
CDN = 〇 U1 | D1
C1 = U1 百 CDN?
F = C1 | DO | U1 | 〇
F2 = 負? F
OP = 加 | 减 | 乘以 | 除以    (i.e., + | - | * | / )
EQ = F2 (OP F2)*


The DO and D1 productions are handled in the same method, diferentiated by a parameter. The other productions take one method each. The EQ is the grammar main symbol. Before starting the parse, it replaces 零 for 〇, so it need to handle just 〇 after that.

The 負 is for negative numbers. It can handle numbers from -999 to 999 (or 負九百九十九 to 九百九十九).

Further, to make it much more chinese, all the identifiers are in chinese. The only exception is the class name (using international characters there may cause problems) that is a chinese name transliterated to latin characters.

For the input I had to use a JOptionPane. Sorry for that, but I had trouble about encodings using other input methods. If you don't like this method of input, you can use the 解方程 method directly, it takes the input formula and produce the output equation (or error message).

import javax.swing.JOptionPane;

public class ZhongguoJisuanQi {

    private final String 文字输入;
    private int 源指数;

    public ZhongguoJisuanQi(String 文字输入) {
        this.文字输入 = 文字输入.replace("零", "〇");
        this.源指数 = 0;
    }

    public static void main(String... 参数) {
        String 方程 = 解方程(读取文本行());
        System.out.println(方程);
        JOptionPane.showMessageDialog(null, 方程, "答案是", JOptionPane.INFORMATION_MESSAGE);
    }

    private static String 读取文本行() {
        return JOptionPane.showInputDialog(null, "输入数学公式", "输入数学公式", JOptionPane.QUESTION_MESSAGE);
    }

    public static String 解方程(String 数学公式) {
        if (数学公式 == null) return "错误：给定的数学公式的格式不正确。";
        ZhongguoJisuanQi 计算器 = new ZhongguoJisuanQi(数学公式);
        Integer 结果 = 计算器.解析并解决了式();
        if (结果 == null) return "错误：给定的数学公式的格式不正确。";
        return 数学公式 + "等于" + 整数转换为文本(结果);
    }

    private boolean 找到字符(char 字符, int 指数) {
        return 指数 &lt; 文字输入.length() &amp;&amp; 文字输入.charAt(指数) == 字符;
    }

    private Integer 解析生产一() {
        int 数 = "一二三四五六七八九".indexOf(文字输入.charAt(源指数));
        if (数 == -1) return null;
        源指数++;
        return 数 + 1;
    }

    private Integer 解析生产十(boolean 必须带有前缀) {
        int 原始来源索引 = 源指数;
        Integer 第一个数字 = 解析生产一();
        if (第一个数字 == null &amp;&amp; 必须带有前缀) return null;
        if (!找到字符('十', 源指数)) {
            源指数 = 原始来源索引;
            return null;
        }
        源指数++;
        Integer 第二个数字 = 解析生产一();
        return (第一个数字 == null ? 1 : 第一个数字) * 10 + (第二个数字 == null ? 0 : 第二个数字);
    }

    private Integer 解析生产或零十() {
        int 原始来源索引 = 源指数;
        if (找到字符('〇', 源指数)) {
            源指数++;
            Integer 数 = 解析生产一();
            if (数 == null) {
                源指数 = 原始来源索引;
                return null;
            }
            return 数;
        }
        return 解析生产十(true);
    }

    private Integer 解析生产百() {
        int 原始来源索引 = 源指数;
        Integer 第一个数字 = 解析生产一();
        if (第一个数字 == null) return null;
        if (!找到字符('百', 源指数)) {
            源指数 = 原始来源索引;
            return null;
        }
        源指数++;
        Integer 第二个数字 = 解析生产或零十();
        return 第一个数字 * 100 + (第二个数字 == null ? 0 : 第二个数字);
    }

    private Integer 解析生产数无符号() {
        Integer 数 = 解析生产百();
        if (数 != null) return 数;
        数 = 解析生产十(false);
        if (数 != null) return 数;
        数 = 解析生产一();
        if (数 != null) return 数;
        if (找到字符('〇', 源指数)) {
            源指数++;
            return 0;
        }
        return null;
    }

    private Integer 解析该生产号() {
        boolean 负 = false;
        if (找到字符('負', 源指数)) {
            源指数++;
            负 = true;
        }
        Integer 数 = 解析生产数无符号();
        return 数 == null ? null : 负 ? -数 : 数;
    }

    private String 解析算术运算符() {
        if (找到字符('加', 源指数)) { 源指数++; return "加"; }
        if (找到字符('减', 源指数)) { 源指数++; return "减"; }
        if (找到字符('乘', 源指数) &amp;&amp; 找到字符('以', 源指数 + 1)) { 源指数 += 2; return "乘以"; }
        if (找到字符('除', 源指数) &amp;&amp; 找到字符('以', 源指数 + 1)) { 源指数 += 2; return "除以"; }
        return null;
    }

    public Integer 解析并解决了式() {
        Integer 第一个数字 = 解析该生产号();
        while (true) {
            String 算术运算符 = 解析算术运算符();
            if (算术运算符 == null) return 源指数 == 文字输入.length() ? 第一个数字 : null;
            Integer 第二个数字 = 解析该生产号();
            if (第二个数字 == null) return null;
            switch (算术运算符) {
                case "加": 第一个数字 += 第二个数字; break;
                case "减": 第一个数字 -= 第二个数字; break;
                case "乘以": 第一个数字 *= 第二个数字; break;
                case "除以": 第一个数字 /= 第二个数字; break;
                default: throw new AssertionError();
            }
        }
    }

    private static String 整数转换为文本(int 参数) {
        if (参数 == 0) return "〇";
        StringBuilder 字符串生成器 = new StringBuilder(7);
        int 数 = 参数;
        if (数 &lt; 0) {
            字符串生成器.append("負");
            数 = -数;
        }
        if (数 &gt;= 1000) return null;
        if (数 &gt;= 100) {
            字符串生成器.append("〇一二三四五六七八九".charAt(数 / 100)).append("百");
            数 %= 100;
            if (数 &gt;= 1 &amp;&amp; 数 &lt;= 9) 字符串生成器.append("〇");
            if (数 &gt;= 10 &amp;&amp; 数 &lt;= 19) 字符串生成器.append("一");
        }
        if (数 &gt;= 20) 字符串生成器.append("〇一二三四五六七八九".charAt(数 / 10));
        if (数 &gt;= 10) 字符串生成器.append("十");
        数 %= 10;
        字符串生成器.append("〇一二三四五六七八九".charAt(数));
        return 字符串生成器.toString();
    }
}


Compile with:

javac -encoding UTF8 ZhongguoJisuanQi.java


Run with:

java ZhongguoJisuanQi


Cheat sheet for identifiers names, accordingly to google translator:

(english original text) -&gt; (chinese text) -&gt; (english text back from chinese)
chinese calculator -&gt; 中国计算器 (Zhōngguó jìsuàn qì) -&gt; china calculator
text input -&gt; 文字输入 -&gt; text input
source index -&gt; 源指数 -&gt; source index
original source index -&gt; 原始来源索引 -&gt; original source index
Enter the mathematical formula -&gt; 输入数学公式 -&gt; Enter mathematical formulas
mathematical formula -&gt; 数学公式 -&gt; mathematical formulas
Error: The given mathematical formula is malformed. -&gt; 错误：给定的数学公式的格式不正确。 -&gt; Error: The given mathematical formula is not correct.
character -&gt; 字符 -&gt; character
read a text line -&gt; 读取文本行 -&gt; read a line of text
arguments -&gt; 参数 -&gt; parameter
equation -&gt; 方程 -&gt; equation
index -&gt; 指数 -&gt; index
find character at -&gt; 找到字符 -&gt; find characters
parse the production -&gt; 解析生产 -&gt; resolve the production
parse the production or zero -&gt; 解析生产或零 -&gt; resolve the production or zero
parse the production number -&gt; 解析该生产号 -&gt; resolve the production number
parse the production number without sign -&gt; 解析生产数无符号 -&gt; resolve production unsigned
parse and solve the formula -&gt; 解析并解决了式 -&gt; parse and resolve the formula
parse an arithmetic operator -&gt; 解析算术运算符 -&gt; parsing arithmetic operators
arithmetic operator -&gt; 算术运算符 -&gt; arithmetic operators
must be prefixed -&gt; 必须带有前缀 -&gt; must be prefixed with
calculator -&gt; 计算器 -&gt; calculators
solve the equation -&gt; 解方程 -&gt; solving equations
result -&gt; 结果 -&gt; result
number -&gt; 数 -&gt; number
minus -&gt; 负 -&gt; minus
first number -&gt; 第一个数字 -&gt; the first number
second number -&gt; 第二个数字 -&gt; second number
string builder -&gt; 字符串生成器 -&gt; string builder
convert integer to text -&gt; 整数转换为文本 -&gt; integer is converted to text
the answer is -&gt; 答案是 -&gt; the answer is