if (picture==null || picture.length()==0) {
return "" + number;
}
int pictureLength = StringValue.getStringLength(picture);
FastStringBuffer sb = new FastStringBuffer(16);
int formchar = picture.charAt(0);
if (UTF16.isHighSurrogate(formchar)) {
formchar = UTF16.combinePair((char)formchar, picture.charAt(1));
}
switch(formchar) {
case '0':
case '1':
sb.append(toRadical(number, westernDigits, pictureLength, groupSize, groupSeparator));
if (ordinal != null && ordinal.length() > 0) {
sb.append(ordinalSuffix(ordinal, number));
}
break;
case 'A':
if (number==0) return "0";
sb.append(toAlphaSequence(number, latinUpper));
break;
case 'a':
if (number==0) return "0";
sb.append(toAlphaSequence(number, latinLower));
break;
case 'w':
case 'W':
int wordCase;
if (picture.equals("W")) {
wordCase = UPPER_CASE;
} else if (picture.equals("w")) {
wordCase = LOWER_CASE;
} else {
// includes cases like "ww" or "Wz". The action here is conformant, but it's not clear what's best
wordCase = TITLE_CASE;
}
if (ordinal != null && ordinal.length() > 0) {
sb.append(toOrdinalWords(ordinal, number, wordCase));
} else {
sb.append(toWords(number, wordCase));
}
break;
case 'i':
if (number==0) return "0";
if (letterValue==null || letterValue.length() == 0 ||
letterValue.equals("traditional")) {
sb.append(toRoman(number));
} else {
alphaDefault(number, 'i', sb);
}
break;
case 'I':
if (number==0) return "0";
if (letterValue==null || letterValue.length() == 0 ||
letterValue.equals("traditional")) {
sb.append(toRoman(number).toUpperCase());
} else {
alphaDefault(number, 'I', sb);
}
break;
case '\u0391':
if (number==0) return "0";
sb.append(toAlphaSequence(number, greekUpper));
break;
case '\u03b1':
if (number==0) return "0";
sb.append(toAlphaSequence(number, greekLower));
break;
case '\u0410':
if (number==0) return "0";
sb.append(toAlphaSequence(number, cyrillicUpper));
break;
case '\u0430':
if (number==0) return "0";
sb.append(toAlphaSequence(number, cyrillicLower));
break;
case '\u05d0':
if (number==0) return "0";
sb.append(toAlphaSequence(number, hebrew));
break;
case '\u3042':
if (number==0) return "0";
sb.append(toAlphaSequence(number, hiraganaA));
break;
case '\u30a2':
if (number==0) return "0";
sb.append(toAlphaSequence(number, katakanaA));
break;
case '\u3044':
if (number==0) return "0";
sb.append(toAlphaSequence(number, hiraganaI));
break;
case '\u30a4':
if (number==0) return "0";
sb.append(toAlphaSequence(number, katakanaI));
break;
case '\u4e00':
if (number==0) return "0";
sb.append(toRadical(number, kanjiDigits, pictureLength, groupSize, groupSeparator));
break;
default:
int digitValue = Alphanumeric.getDigitValue(formchar);
if (digitValue >= 0) {
int zero = formchar - digitValue;
int[] digits = new int[10];
for (int z=0; z<=9; z++) {
digits[z] = zero+z;
}
sb.append(toRadical(number, digits, pictureLength, groupSize, groupSeparator));
break;
} else {
if (number==0) return "0";
if (formchar < '\u1100') {
alphaDefault(number, (char)formchar, sb);
} else {
// fallback to western numbering
sb.append(
toRadical(number, westernDigits, pictureLength, groupSize, groupSeparator));
}
break;
}
}
return sb.toString();
}