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; } }
ไม่มีความคิดเห็น:
แสดงความคิดเห็น