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