Задача: Преобразование сумм из цифрового представления в строковое
Фрагмент: ключевое преобразование [java]
  1. public String toString () {
  2. StringBuffer result = new StringBuffer ();
  3. BigInteger [] divrem = summ.divideAndRemainder (hundred);
  4. if (divrem [0].signum () == 0) result.append ("Ноль ");
  5. divrem = divrem [0].divideAndRemainder (thousand);
  6. BigInteger quotient = divrem [0];
  7. BigInteger remainder = divrem [1];
  8. int group = 0;
  9. do {
  10. int value = remainder.intValue ();
  11. result.insert (0, groupToString (value, group));
  12. // Для нулевой группы добавим в конец соответствующую валюту
  13. if (group == 0) {
  14. int rank10 = (value % 100) / 10;
  15. int rank = value % 10;
  16. if (rank10 == 1) {
  17. result = result.append (suff [2]);
  18. }
  19. else {
  20. switch (rank) {
  21. case 1: result = result.append (suff [0]); break;
  22. case 2:
  23. case 3:
  24. case 4: result = result.append (suff [1]); break;
  25. default: result = result.append (suff [2]); break;
  26. }
  27. }
  28. }
  29. divrem = quotient.divideAndRemainder (thousand);
  30. quotient = divrem [0];
  31. remainder = divrem [1];
  32. group++;
  33. }
  34. while (!quotient.equals (zero) || !remainder.equals (zero));
  35.  
  36. // Дробная часть суммы
  37. String s = getRightPart ();
  38. result = result.append (" ").append (s);
  39. result = result.append (" ");
  40.  
  41. if (s.charAt (0) == '1') {
  42. result = result.append (suff [5]);
  43. }
  44. else {
  45. switch (s.charAt(1)) {
  46. case '1': result = result.append (suff [3]); break;
  47. case '2':
  48. case '3':
  49. case '4': result = result.append (suff [4]); break;
  50. default: result = result.append (suff [5]); break;
  51. }
  52. }
  53. // По правилам бухгалтерского учета первая буква строкового
  54. // представления должна быть в верхнем регистре
  55. result.setCharAt (0, Character.toUpperCase (result.charAt (0)));
  56.  
  57. // Вот ради этой строки все и затевалось: результат получен !!!
  58. fplAmount.res = result.toString();
  59. return result.toString();
  60. }
  61.  
  62. // Преобразование группы цифр в строку
  63. String groupToString (int value, int group) {
  64. if (value < 0 || value > 999) throw new IllegalArgumentException ("value must be between 0 an 999 inclusively");
  65. if (group < 0) throw new IllegalArgumentException ("group must be more than 0");
  66. StringBuffer result = new StringBuffer (32);
  67. if (value == 0) {
  68. return result.toString();
  69. }
  70. // Разбор числа по разрядам, начиная с сотен
  71. int rank = value / 100;
  72. switch (rank) {
  73. default: break;
  74. case 1: result = result.append ("сто "); break;
  75. case 2: result = result.append ("двести "); break;
  76. case 3: result = result.append ("триста "); break;
  77. case 4: result = result.append ("четыреста "); break;
  78. case 5: result = result.append ("пятьсот "); break;
  79. case 6: result = result.append ("шестьсот "); break;
  80. case 7: result = result.append ("семьсот "); break;
  81. case 8: result = result.append ("восемьсот "); break;
  82. case 9: result = result.append ("девятьсот "); break;
  83. }
  84. // Далее, десятки
  85. rank = (value % 100) / 10;
  86. switch (rank) {
  87. default: break;
  88. case 2: result = result.append ("двадцать "); break;
  89. case 3: result = result.append ("тридцать "); break;
  90. case 4: result = result.append ("сорок "); break;
  91. case 5: result = result.append ("пятьдесят "); break;
  92. case 6: result = result.append ("шестьдесят "); break;
  93. case 7: result = result.append ("семьдесят "); break;
  94. case 8: result = result.append ("восемьдесят "); break;
  95. case 9: result = result.append ("девяносто "); break;
  96. }
  97. // Если десятки = 1, добавить соответствующее значение. Иначе - единицы
  98. int rank10 = rank;
  99. rank = value % 10;
  100. if (rank10 == 1) {
  101. switch (rank) {
  102. case 0: result = result.append ("десять "); break;
  103. case 1: result = result.append ("одиннадцать "); break;
  104. case 2: result = result.append ("двенадцать "); break;
  105. case 3: result = result.append ("тринадцать "); break;
  106. case 4: result = result.append ("четырнадцать "); break;
  107. case 5: result = result.append ("пятнадцать "); break;
  108. case 6: result = result.append ("шестнадцать "); break;
  109. case 7: result = result.append ("семнадцать "); break;
  110. case 8: result = result.append ("восемнадцать "); break;
  111. case 9: result = result.append ("девятнадцать "); break;
  112. }
  113. }
  114. else {
  115. switch (rank) {
  116. default:
  117. break;
  118. case 1:
  119. if (group == 1) // Тысячи
  120. result = result.append ("одна ");
  121. else
  122. // Учесть род валюты (поле "Sex" настроечной информации)
  123. if (suff [6].equals ("M")) result = result.append ("один ");
  124. if (suff [6].equals ("F")) result = result.append ("одна ");
  125. break;
  126. case 2:
  127. if (group == 1) // Тысячи
  128. result = result.append ("две ");
  129. else
  130. // Учесть род валюты (поле "Sex" настроечной информации)
  131. if (suff [6].equals ("M")) result = result.append ("два ");
  132. if (suff [6].equals ("F")) result = result.append ("две ");
  133. break;
  134. case 3: result = result.append ("три "); break;
  135. case 4: result = result.append ("четыре "); break;
  136. case 5: result = result.append ("пять "); break;
  137. case 6: result = result.append ("шесть "); break;
  138. case 7: result = result.append ("семь "); break;
  139. case 8: result = result.append ("восемь "); break;
  140. case 9: result = result.append ("девять "); break;
  141. }
  142. }
  143. // Значение группы: тысячи, миллионы и т.д.
  144. switch (group) {
  145. default:
  146. break;
  147. case 1:
  148. if (rank10 == 1)
  149. result = result.append ("тысяч ");
  150. else {
  151. switch (rank) {
  152. default: result = result.append ("тысяч "); break;
  153. case 1: result = result.append ("тысяча "); break;
  154. case 2:
  155. case 3:
  156. case 4: result = result.append ("тысячи "); break;
  157. }
  158. }
  159. break;
  160. case 2:
  161. if (rank10 == 1)
  162. result = result.append ("миллионов ");
  163. else {
  164. switch (rank) {
  165. default: result = result.append ("миллионов "); break;
  166. case 1: result = result.append ("миллион "); break;
  167. case 2:
  168. case 3:
  169. case 4: result = result.append ("миллиона "); break;
  170. }
  171. }
  172. break;
  173. case 3:
  174. if (rank10 == 1)
  175. result = result.append ("миллиардов ");
  176. else {
  177. switch (rank) {
  178. default: result = result.append ("миллиардов "); break;
  179. case 1: result = result.append ("миллиард "); break;
  180. case 2:
  181. case 3:
  182. case 4: result = result.append ("миллиарда "); break;
  183. }
  184. }
  185. break;
  186. case 4:
  187. if (rank10 == 1)
  188. result = result.append ("триллионов ");
  189. else {
  190. switch (rank) {
  191. default: result = result.append ("триллионов "); break;
  192. case 1: result = result.append ("триллион "); break;
  193. case 2:
  194. case 3:
  195. case 4: result = result.append ("триллиона "); break;
  196. }
  197. }
  198. break;
  199. }
  200. return result.toString();
  201. }
  202. }