17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert****************************************************************************** 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Copyright (C) 2007-2012, International Business Machines Corporation and * 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* others. All Rights Reserved. * 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert****************************************************************************** 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/ 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.impl.duration.impl; 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale; 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class Utils { 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final Locale localeFromString(String s) { 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String language = s; 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String region = ""; 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String variant = ""; 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int x = language.indexOf("_"); 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (x != -1) { 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert region = language.substring(x+1); 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert language = language.substring(0, x); 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert x = region.indexOf("_"); 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (x != -1) { 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert variant = region.substring(x+1); 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert region = region.substring(0, x); 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new Locale(language, region, variant); 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static <T> T[] arraycopy(T[] src) { 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert T[] result = (T[])Array.newInstance(src.getClass().getComponentType(), src.length); // can we do this without casting? 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < src.length; ++i) { 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result[i] = src[i]; 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return result; 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Interesting features of chinese numbers: 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * - Each digit is followed by a unit symbol (10's, 100's, 1000's). 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * - Units repeat in levels of 10,000, there are symbols for each level too (except 1's). 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * - The digit 2 has a special form before the 10 symbol and at the end of the number. 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * - If the first digit in the number is 1 and its unit is 10, the 1 is omitted. 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * - Sequences of 0 digits and their units are replaced by a single 0 and no unit. 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * - If there are two such sequences of 0 digits in a level (1000's and 10's), the 1000's 0 is also omitted. 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * - The 1000's 0 is also omitted in alternating levels, such that it is omitted in the rightmost 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * level with a 10's 0, or if none, in the rightmost level. 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * - Level symbols are omitted if all of their units are omitted 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static String chineseNumber(long n, ChineseDigits zh) { 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (n < 0) { 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n = -n; 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (n <= 10) { 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (n == 2) { 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return String.valueOf(zh.liang); 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return String.valueOf(zh.digits[(int)n]); 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 9223372036854775807 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char[] buf = new char[40]; // as long as we get, and actually we can't get this high, no units past zhao 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char[] digits = String.valueOf(n).toCharArray(); 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // first, generate all the digits in place 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // convert runs of zeros into a single zero, but keep places 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean inZero = true; // true if we should zap zeros in this block, resets at start of block 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean forcedZero = false; // true if we have a 0 in tens's place 727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int x = buf.length; 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = digits.length, u = -1, l = -1; --i >= 0;) { 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (u == -1) { 757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (l != -1) { 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf[--x] = zh.levels[l]; 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert inZero = true; 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert forcedZero = false; 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ++u; 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf[--x] = zh.units[u++]; 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (u == 3) { 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert u = -1; 857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ++l; 867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int d = digits[i] - '0'; 897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (d == 0) { 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (x < buf.length-1 && u != 0) { 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf[x] = '*'; 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (inZero || forcedZero) { 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf[--x] = '*'; 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf[--x] = zh.digits[0]; 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert inZero = true; 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert forcedZero = u == 1; 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert inZero = false; 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf[--x] = zh.digits[d]; 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // scanning from right, find first required 'ling' 1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // we only care if n > 101,0000 as this is the first case where 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // it might shift. remove optional lings in alternating blocks. 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (n > 1000000) { 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean last = true; 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int i = buf.length - 3; 1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert do { 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (buf[i] == '0') { 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert i -= 8; 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert last = !last; 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } while (i > x); 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert i = buf.length - 7; 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert do { 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (buf[i] == zh.digits[0] && !last) { 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf[i] = '*'; 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert i -= 8; 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert last = !last; 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } while (i > x); 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // remove levels for empty blocks 1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (n >= 100000000) { 1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert i = buf.length - 8; 1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert do { 1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean empty = true; 1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int j = i-1, e = Math.max(x-1, i-8); j > e; --j) { 1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (buf[j] != '*') { 1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert empty = false; 1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (empty) { 1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (buf[i+1] != '*' && buf[i+1] != zh.digits[0]) { 1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf[i] = zh.digits[0]; 1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf[i] = '*'; 1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert i -= 8; 1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } while (i > x); 1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // replace er by liang except before or after shi or after ling 1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = x; i < buf.length; ++i) { 1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (buf[i] != zh.digits[2]) continue; 1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (i < buf.length - 1 && buf[i+1] == zh.units[0]) continue; 1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (i > x && (buf[i-1] == zh.units[0] || buf[i-1] == zh.digits[0] || buf[i-1] == '*')) continue; 1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf[i] = zh.liang; 1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // eliminate leading 1 if following unit is shi 1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (buf[x] == zh.digits[1] && (zh.ko || buf[x+1] == zh.units[0])) { 1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ++x; 1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // now, compress out the '*' 1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int w = x; 1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int r = x; r < buf.length; ++r) { 1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (buf[r] != '*') { 1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf[w++] = buf[r]; 1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new String(buf, x, w-x); 1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// public static void main(String[] args) { 1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// for (int i = 0; i < args.length; ++i) { 1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// String arg = args[i]; 1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// System.out.print(arg); 1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// System.out.print(" > "); 1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// long n = Long.parseLong(arg); 1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// System.out.println(chineseNumber(n, ChineseDigits.DEBUG)); 1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// } 1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// } 1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static class ChineseDigits { 1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final char[] digits; 1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final char[] units; 1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final char[] levels; 1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final char liang; 1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final boolean ko; 1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ChineseDigits(String digits, String units, String levels, char liang, boolean ko) { 1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.digits = digits.toCharArray(); 1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.units = units.toCharArray(); 1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.levels = levels.toCharArray(); 1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.liang = liang; 1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.ko = ko; 1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final ChineseDigits DEBUG = 2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ChineseDigits("0123456789s", "sbq", "WYZ", 'L', false); 2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final ChineseDigits TRADITIONAL = 2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ChineseDigits("\u96f6\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341", // to shi 2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\u5341\u767e\u5343", // shi, bai, qian 2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\u842c\u5104\u5146", // wan, yi, zhao 2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert '\u5169', false); // liang 2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final ChineseDigits SIMPLIFIED = 2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ChineseDigits("\u96f6\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341", // to shi 2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\u5341\u767e\u5343", // shi, bai, qian 2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\u4e07\u4ebf\u5146", // wan, yi, zhao 2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert '\u4e24', false); // liang 2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // no 1 before first unit no matter what it is 2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // not sure if there are 'ling' units 2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final ChineseDigits KOREAN = 2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ChineseDigits("\uc601\uc77c\uc774\uc0bc\uc0ac\uc624\uc721\uce60\ud314\uad6c\uc2ed", // to ten 2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\uc2ed\ubc31\ucc9c", // 10, 100, 1000 2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\ub9cc\uc5b5?", // 10^4, 10^8, 10^12 2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert '\uc774', true); 2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 225