public String toString () { StringBuffer result = new StringBuffer (); BigInteger [] divrem = summ.divideAndRemainder (hundred); if (divrem [0].signum () == 0) result.append ("Ноль "); divrem = divrem [0].divideAndRemainder (thousand); BigInteger quotient = divrem [0]; BigInteger remainder = divrem [1]; 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)); // Дробная часть суммы String s = getRightPart (); 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 || value > 999) throw new IllegalArgumentException ("value must be between 0 an 999 inclusively"); if (group < 0) throw new IllegalArgumentException ("group must be more than 0"); StringBuffer result = new StringBuffer (32); 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(); } }