java 轉換中文數字為阿拉伯數字
可以轉換以下格式的數字:
一百
三千五
二萬三千五百三
3千4百
package com.baijob.vsearch.util; import java.util.*; /** * 處理數詞的工具類 * @author liushiquan * */ public class DigitUtil { /** * 阿拉伯數字 */ private static Set<Character> araDigits = new HashSet<Character>(); /** * 漢字中的數字字符 */ private static char[] SCDigits = {'零','一','二','三','四','五','六','七','八','九','十','百','千','萬','億'}; /** * 漢字中的大寫數字字符 */ private static char[] TCDigits = {'零','壹','貳','叁','肆','伍','陸','柒','捌','玖','拾','佰','仟','萬','億'}; /** * 繁體中文和簡體中文的對應關系 */ private static Map<Character,Character> map = new HashMap<Character,Character>(); static { for (int i = 0; i < TCDigits.length; i++) { map.put(TCDigits[i], SCDigits[i]); } for (char i = '0'; i <= '9'; i++) { araDigits.add(i); } } private DigitUtil(){ } public static void main(String[] args) { System.out.println(parseDigits("零三")); } /** * 解析中文格式的數字,假定參數中全是漢字,否則會解析異常,解析失敗返回null * @param hanzi * @return */ public static Integer parseDigits(String hanzi) { if (!isDigits(hanzi)) return null; int ret; try { if (hanzi.charAt(0) == '+') hanzi = hanzi.substring(1); ret = Integer.parseInt(hanzi); } catch (Exception e) { char[] chars = hanzi.toCharArray(); changeTCtoSC(chars); ret = parse(chars,0,chars.length,1); } return ret; } public static boolean isDigits(String s) { if (s.charAt(0) == '+') s = s.substring(1); try { Integer.parseInt(s); return true; } catch (Exception e) { for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (!map.values().contains(c) && !araDigits.contains(c)) return false; } return true; } } private static int parse(char[] chars,int start,int end, int preNumber) { int ret = 0; if (start == end) { ret = 0; } else if (start + 1 == end) { switch (chars[start]) { case '一': case '1': ret = 1 * preNumber; break; case '二': case '2': ret = 2 * preNumber; break; case '三': case '3': ret = 3 * preNumber; break; case '四': case '4': ret = 4 * preNumber; break; case '五': case '5': ret = 5 * preNumber; break; case '六': case '6': ret = 6 * preNumber; break; case '七': case '7': ret = 7 * preNumber; break; case '八': case '8': ret = 8 * preNumber; break; case '九': case '9': ret = 9 * preNumber; break; } } else { int index; if ((index = indexOf(chars,start,end,'零')) == 0 || (index = indexOf(chars,start,end,'0')) == 0) { ret = parse(chars, start + 1, end, 1); } else if ((index = indexOf(chars,start,end,'億')) != -1) { ret = parse(chars, start,index, 1) * 100000000 + parse(chars,index + 1,end,10000000); } else if ((index = indexOf(chars,start,end,'萬')) != -1) { ret = parse(chars, start,index, 1) * 10000 + parse(chars,index + 1,end,1000); } else if ((index = indexOf(chars,start,end,'千')) != -1) { ret = parse(chars, start, index, 1) * 1000 + parse(chars,index + 1,end,100); } else if ((index = indexOf(chars,start,end,'百')) != -1) { ret = parse(chars, start, index, 1) * 100 + parse(chars,index + 1,end,10); } else if ((index = indexOf(chars,start,end,'十')) != -1) { ret = parse(chars, start, index, 1) * 10 + parse(chars,index + 1,end,1); } } return ret; } private static int indexOf(char[] chars, int start, int end, char c) { for (int i = start; i < end; i++) { if (chars[i] == c) return i; } return -1; } /** * 將繁體中文轉換為簡體中文 * @param chars */ private static void changeTCtoSC(char[] chars) { for (int i = 0; i < chars.length; i++) { Character c = map.get(chars[i]); if (c != null) chars[i] = c; } } } //該片段來自于http://outofmemory.cn
本文由用戶 ErvCavill 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!