หน้าเว็บ

วันจันทร์ที่ 4 มิถุนายน พ.ศ. 2555

โปรแกรมอ่านตัวเลข (java)





NumberReaderTest.java
package com.blogspot.na5cent.numberreader.test;

import com.blogspot.na5cent.numberreader.NumberReader;
import com.blogspot.na5cent.numberreader.ThaiNumberReader;
import junit.framework.TestCase;

/**
 *
 * @author redcrow
 * create 24/12/2013
 */
public class NumberReaderTest extends TestCase {

    public NumberReaderTest(String testName) {
        super(testName);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public void testReader() {
        NumberReader reader = new ThaiNumberReader();
        
        assertEquals("ลบสี่ล้านสี่ร้อยยี่สิบสองจุดเจ็ดสองแปดห้าห้า", reader.read(-4000422.72855, 5));
        assertEquals("สิบเอ็ดล้านจุดศูนย์ศูนย์สอง", reader.read(11000000.002,3));
        assertEquals("หนึ่งร้อยยี่สิบล้านสามหมื่นสองพันเอ็ดจุดสี่สองศูนย์", reader.read(120032001.42,3));
        assertEquals("หนึ่งพันเก้าร้อยเก้าสิบเอ็ด", reader.read(1991.430,0));
        assertEquals("ยี่สิบห้าจุดหนึ่งสองศูนย์", reader.read(25.1205000,3));
        assertEquals("ยี่สิบห้า", reader.read(25));
        assertEquals("หนึ่งจุดเก้าแปดเก้าแปดหนึ่งศูนย์ห้าศูนย์", reader.read(1.9898105000,8));
    }
}
NumberReader.java
package com.blogspot.na5cent.numberreader;

/**
 * @author redcrow 
 * create 24/12/2013
 */
public interface NumberReader {

    public String read(double number, int floatingPoint);
    
    public String read(double number);
}
ThaiNumberReader.java
package com.blogspot.na5cent.numberreader;

/**
 * @author redcrow
 * create 05/05/2012
 * modify 24/12/2013
 */
public class ThaiNumberReader implements NumberReader {

    private static final String THAI_LEVEL[] = {"", "สิบ", "ร้อย", "พัน", "หมื่น", "แสน"};
    private static final String THAI_WORD[] = {"ศูนย์", "หนึ่ง", "สอง", "สาม", "สี่", "ห้า", "หก", "เจ็ด", "แปด", "เก้า"};

    public String read(double number, int floatingPoint) {
        String notation = (number < 0) ? "ลบ" : "";
        number = absoluteNumber(number);
        return notation + beforePointReading(number) + (floatingPoint < 1 ? "" : ("จุด" + afterPointReading(number, floatingPoint)));
    }

    public String read(double number) {
        String numberString = number + "";
        int floatingPoint = 0;
        int indexOf = numberString.indexOf(".");
        if (indexOf != -1) {
            String floating = numberString.substring(indexOf + 1);
            floatingPoint = floating.equals("0") ? 0 : floating.length();
        }

        return read(number, floatingPoint);
    }

    private String checkZero(String reading) {
        return reading.isEmpty() ? "ศูนย์" : reading;
    }

    private double absoluteNumber(double number) {
        return number < 0 ? (-1) * number : number;
    }

    private String beforePointReading(double number) {
        long beforePointNumber = (long) number;//12.32 -> 12
        String reading = "";

        int index;
        int levelCount = 0;

        while (beforePointNumber > 0) {
            index = (int) (beforePointNumber % 10);
            String word = getWord(beforePointNumber, index, levelCount);
            String level = getLevel(index, levelCount);
            reading = word + level + reading;

            beforePointNumber = (beforePointNumber / 10);
            levelCount = levelCount + 1;
        }

        return checkZero(reading);
    }

    private String afterPointReading(double number, int floatingPoint) {
        double afterPointNumber = (number - (long) number);//12.32 - 12 -> 0.32
        String reading = "";

        for (int i = 1; i <= floatingPoint; i++) {
            int index = (int) (Math.pow(10, i) * afterPointNumber) % 10;
            reading = reading + THAI_WORD[index];
        }

        return checkZero(reading);
    }

    private String getWord(long number, int index, int levelCount) {
        String word;
        if (index == 0) {
            word = "";//0 จะไม่อ่านออกเสียง เช่น 20, 30, 40
        } else if (index == 1) {
            if ((levelCount % 6) == 0 && (number > 1)) {//เช็คระดับล้าน เช่น สิบเอ็ดล้าน
                word = "เอ็ด";//เช่น คำอ่านของ 101
            } else if (levelCount % 6 == 1) {
                word = "";//แทนคำอ่านของ 1 ซึ่งไม่อ่านออกเสียง เช่น 16, 19
            } else {
                word = "หนึ่ง";
            }
        } else if (index == 2) {
            if (levelCount % 6 == 1) {//เช็คระดับล้าน เช่น ยี่สิบล้าน
                word = "ยี่";//แทนคำอ่านของ 2 ในหลัก 10 เช่น 23
            } else {
                word = "สอง";
            }
        } else {
            word = THAI_WORD[index];
        }

        return word;
    }

    private String getLevel(int index, int levelCount) {
        String level;
        if ((levelCount != 0) && (levelCount % 6 == 0)) {
            level = "ล้าน";
        } else if (index != 0) {
            level = THAI_LEVEL[levelCount % 6];
        } else {
            level = "";//แทนหลักหน่วย  ซึ่งไม่อ่านออกเสียง
        }

        return level;
    }
}

ไม่มีความคิดเห็น:

แสดงความคิดเห็น