BigInteger [] divrem = summ.
divideAndRemainder (hundred
);
if (divrem [0].signum () == 0) result.append ("Ноль ");
divrem = divrem [0].divideAndRemainder (thousand);
int group = 0;
do {
int value = remainder.intValue ();
result.insert (0, groupToString (value, group));
// Для нулевой группы добавим в конец соответствующую валюту
if (group == 0) {
int rank10 = (value % 100) / 10;
int rank = value % 10;
if (rank10 == 1) {
result = result.append (suff [2]);
}
else {
switch (rank) {
case 1: result = result.append (suff [0]); break;
case 2:
case 3:
case 4: result = result.append (suff [1]); break;
default: result = result.append (suff [2]); break;
}
}
}
divrem = quotient.divideAndRemainder (thousand);
quotient = divrem [0];
remainder = divrem [1];
group++;
}
while (!quotient.equals (zero) || !remainder.equals (zero));
// Дробная часть суммы
result = result.append (" ").append (s);
result = result.append (" ");
if (s.charAt (0) == '1') {
result = result.append (suff [5]);
}
else {
switch (s.charAt(1)) {
case '1': result = result.append (suff [3]); break;
case '2':
case '3':
case '4': result = result.append (suff [4]); break;
default: result = result.append (suff [5]); break;
}
}
// По правилам бухгалтерского учета первая буква строкового
// представления должна быть в верхнем регистре
result.
setCharAt (0,
Character.
toUpperCase (result.
charAt (0)));
// Вот ради этой строки все и затевалось: результат получен !!!
fplAmount.res = result.toString();
return result.toString();
}
// Преобразование группы цифр в строку
String groupToString
(int value,
int group
) { if (value == 0) {
return result.toString();
}
// Разбор числа по разрядам, начиная с сотен
int rank = value / 100;
switch (rank) {
default: break;
case 1: result = result.append ("сто "); break;
case 2: result = result.append ("двести "); break;
case 3: result = result.append ("триста "); break;
case 4: result = result.append ("четыреста "); break;
case 5: result = result.append ("пятьсот "); break;
case 6: result = result.append ("шестьсот "); break;
case 7: result = result.append ("семьсот "); break;
case 8: result = result.append ("восемьсот "); break;
case 9: result = result.append ("девятьсот "); break;
}
// Далее, десятки
rank = (value % 100) / 10;
switch (rank) {
default: break;
case 2: result = result.append ("двадцать "); break;
case 3: result = result.append ("тридцать "); break;
case 4: result = result.append ("сорок "); break;
case 5: result = result.append ("пятьдесят "); break;
case 6: result = result.append ("шестьдесят "); break;
case 7: result = result.append ("семьдесят "); break;
case 8: result = result.append ("восемьдесят "); break;
case 9: result = result.append ("девяносто "); break;
}
// Если десятки = 1, добавить соответствующее значение. Иначе - единицы
int rank10 = rank;
rank = value % 10;
if (rank10 == 1) {
switch (rank) {
case 0: result = result.append ("десять "); break;
case 1: result = result.append ("одиннадцать "); break;
case 2: result = result.append ("двенадцать "); break;
case 3: result = result.append ("тринадцать "); break;
case 4: result = result.append ("четырнадцать "); break;
case 5: result = result.append ("пятнадцать "); break;
case 6: result = result.append ("шестнадцать "); break;
case 7: result = result.append ("семнадцать "); break;
case 8: result = result.append ("восемнадцать "); break;
case 9: result = result.append ("девятнадцать "); break;
}
}
else {
switch (rank) {
default:
break;
case 1:
if (group == 1) // Тысячи
result = result.append ("одна ");
else
// Учесть род валюты (поле "Sex" настроечной информации)
if (suff [6].equals ("M")) result = result.append ("один ");
if (suff [6].equals ("F")) result = result.append ("одна ");
break;
case 2:
if (group == 1) // Тысячи
result = result.append ("две ");
else
// Учесть род валюты (поле "Sex" настроечной информации)
if (suff [6].equals ("M")) result = result.append ("два ");
if (suff [6].equals ("F")) result = result.append ("две ");
break;
case 3: result = result.append ("три "); break;
case 4: result = result.append ("четыре "); break;
case 5: result = result.append ("пять "); break;
case 6: result = result.append ("шесть "); break;
case 7: result = result.append ("семь "); break;
case 8: result = result.append ("восемь "); break;
case 9: result = result.append ("девять "); break;
}
}
// Значение группы: тысячи, миллионы и т.д.
switch (group) {
default:
break;
case 1:
if (rank10 == 1)
result = result.append ("тысяч ");
else {
switch (rank) {
default: result = result.append ("тысяч "); break;
case 1: result = result.append ("тысяча "); break;
case 2:
case 3:
case 4: result = result.append ("тысячи "); break;
}
}
break;
case 2:
if (rank10 == 1)
result = result.append ("миллионов ");
else {
switch (rank) {
default: result = result.append ("миллионов "); break;
case 1: result = result.append ("миллион "); break;
case 2:
case 3:
case 4: result = result.append ("миллиона "); break;
}
}
break;
case 3:
if (rank10 == 1)
result = result.append ("миллиардов ");
else {
switch (rank) {
default: result = result.append ("миллиардов "); break;
case 1: result = result.append ("миллиард "); break;
case 2:
case 3:
case 4: result = result.append ("миллиарда "); break;
}
}
break;
case 4:
if (rank10 == 1)
result = result.append ("триллионов ");
else {
switch (rank) {
default: result = result.append ("триллионов "); break;
case 1: result = result.append ("триллион "); break;
case 2:
case 3:
case 4: result = result.append ("триллиона "); break;
}
}
break;
}
return result.toString();
}
}