DBNum2.java
package com.github.mygreen.cellformatter.callback;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.github.mygreen.cellformatter.term.Term;
/**
* DBNum2を処理する。
* <p>大字(だいじ)に変換する</p>
*
* @since 2.0
* @author T.TSUCHIE
*
*/
public class DBNum2 extends DBNumBase {
/**
* インスタンスを取得する
* @return {@link DBNum2}のインスタンス
*/
public static DBNum2 create() {
return new DBNum2();
}
/**
* 言語ごとの変換処理のマップ
*/
private Map<String, KansujiConverter> converters = new ConcurrentHashMap<>();
public DBNum2() {
super("ja", "zh", "ko");
this.converters.put("ja", new JapaneseConverter());
this.converters.put("zh", new ChineseConverter());
this.converters.put("ko", new KoreanConverter());
}
@Override
public String call(Object data, String value, Locale locale, Term<?> term) {
final String language = locale.getLanguage().toLowerCase();
return converters.get(language).convert(value, is4YearTerm(term));
}
/**
* 日本語の場合の変換処理
*
* @since 2.0
* @author T.TSUCHIE
*
*/
public static class JapaneseConverter extends KansujiConverter {
public JapaneseConverter() {
// 数字のマップ
setNumMap(new String[] {
"〇",
"壱",
"弐",
"参",
"四",
"伍",
"六",
"七",
"八",
"九"
});
// 10^4桁ごと単位のマップ
setDigits10Map(new String[] {
"", // 10^0
"萬", // 10^4
"億", // 10^8
"兆", // 10^12
"京" // 10^16
});
// 4桁の単位のマップ
setDigits4Map(new String[] {
"",
"拾",
"百",
"阡"
});
}
@Override
protected String replace4Digits(final String value) {
// 桁ごとに変換を行う。
final int length = value.length();
final List<String> digits = new ArrayList<>();
for(int i=0; i < length; i++) {
// 下の桁から処理する
final char c = value.charAt(length-i-1);
if(c == '0') {
continue;
}
// 12の場合も、「壱拾弐」と1を省略さない。
String item = replaceSimple(String.valueOf(c)) + digits4Map[i];
digits.add(item);
}
/*
* 文字列に直す。
* ・桁数が逆順になっているので、戻し結合する。
*/
Collections.reverse(digits);
StringBuilder sb = new StringBuilder();
for(String item : digits) {
sb.append(item);
}
return sb.toString();
}
}
/**
* 中国語の場合の変換処理
*
* @since 2.0
* @author T.TSUCHIE
*
*/
public static class ChineseConverter extends DBNum1.ChineseConverter {
public ChineseConverter() {
// 数字のマップ
setNumMap(new String[] {
"零",
"壹",
"贰",
"叁",
"肆",
"伍",
"陆",
"柒",
"捌",
"玖"
});
// 10^4桁ごと単位のマップ
setDigits10Map(new String[] {
"", // 10^0
"万", // 10^4 日本語の万(0x969c)とは異なる、万(0x8DC0)
"亿", // 10^8
"兆", // 10^12
"京" // 10^16
});
// 4桁の単位のマップ
setDigits4Map(new String[] {
"",
"拾",
"佰",
"仟"
});
}
}
/**
* 韓国国の場合の変換処理
*
* @since 2.0
* @author T.TSUCHIE
*
*/
public static class KoreanConverter extends DBNum1.KoreanConverter {
public KoreanConverter() {
// 数字のマップ
setNumMap(new String[] {
"零",
"壹",
"貳",
"參",
"四",
"伍",
"六",
"七",
"八",
"九"
});
// 10^4桁ごと単位のマップ
setDigits10Map(new String[] {
"", // 10^0
"萬", // 10^4
"億", // 10^8
"兆", // 10^12
"京" // 10^16
});
// 4桁の単位のマップ
setDigits4Map(new String[] {
"",
"拾",
"百",
"阡"
});
}
}
}