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.javapackage 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;
}
}


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