Сумма прописью по русски





0
Date Submitted Sat. Jan. 1st, 2005 12:00 AM
Revision 1 of 1
Beginner spariev
Tags "Java"
Comments 0 comments
Сумма прописью по русски

import java.math.BigDecimal;
import java.math.BigInteger;

/**
 *  * Класс, преобразующий сумму в строковое представление из цифрового
 *
 * Usage Pattern
 * String[] suff = new String[]{
 * "рубль", // строковое представление последней цифры целой части
 * "рубля",
 * "рублей",
 * "копейка", // строковое представление последней цифры дробной части
 * "копейки",
 * "копеек",
 * "F" //род валюты (M - мужской, F - женский)
 * } ;
 * String result = new AmoutToString(suff,new Double(10).toString());
 */


public class CustAmoutToString {


          private BigInteger summ;
          private String[] suff;
          private static final BigInteger zero = new BigInteger("0");
          private static final BigInteger hundred = new BigInteger("100");
          private static final BigInteger thousand = new BigInteger("1000");

          // Конструктор класса. Конструктор в качестве параметров получает:
          // String suff []   массив наименований (настроечная информация) и
          // Массив суффиксов - окончаний. Элементы массива:
          // 0...5 - строки целой и дробной частей;
          // 6     - род валюты (M - мужской, F - женский)
          // String sum       сумма для преобразования
          public CustAmoutToString(String[] suff, String s) {
                this.suff = suff;
                doOperation (s);
          }
//      Конструктор класса. Конструктор в качестве параметров получает: (массив валют умолчальный - рубли)
// String sum       сумма для преобразования
        public CustAmoutToString(String s) {
                this.suff  = new String[]{
                "рубль", "рубля", "рублей",
                "копейка", "копейки", "копеек",
                "M" } ;
                doOperation (s);       
        }
       
        private void doOperation (String s) {
                try {
                  BigDecimal decimal = new BigDecimal(s);
                  // Преобразуем в копейки (центы, пфенниги и т.д.),
                  // одним словом - убираем дробную часть
                  decimal = decimal.multiply(new BigDecimal(100.00));
                  summ = decimal.toBigInteger();
                  // Приступить к преобразованию
//              toString();

                }
                catch (NumberFormatException e) {
                        //TODO вставить какое нить обозначение, наверное лучше писать в лог
                }
        }

          // Получить правую (дробную) часть суммы
          public String getRightPart() {
                return alignSumm(summ.remainder(hundred).abs().toString());
          }

          // Если сумма меньше 10, то выровнять ее дописыванием "0"
          String alignSumm(String s) {
                switch (s.length()) {
                  case 0:
                        s = "00";
                        break;
                  case 1:
                        s = "0" + s;
                        break;
                }
                return s;
          }

          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.append(suff[2]);
                        }
                        else {
                          switch (rank) {
                                case 1:
                                  result.append(suff[0]);
                                  break;
                                case 2:
                                case 3:
                                case 4:
                                  result.append(suff[1]);
                                  break;
                                default:
                                  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.append(" ");
                result.append(s);
                result.append(" ");

                if (s.charAt(0) == '1') {
                  result.append(suff[5]);
                }
                else {
                  switch (s.charAt(1)) {
                        case '1':
                          result.append(suff[3]);
                          break;
                        case '2':
                        case '3':
                        case '4':
                          result.append(suff[4]);
                          break;
                        default:
                          result.append(suff[5]);
                          break;
                  }
                }
                // По правилам бухгалтерского учета первая буква строкового
                // представления должна быть в верхнем регистре
                result.setCharAt(0, Character.toUpperCase(result.charAt(0)));

                // Вот ради этой строки все и затевалось: результат получен !!!

                return result.toString();
          }

          // Преобразование группы цифр в строку
          String groupToString(int value, int group) throws IllegalArgumentException {
                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.append("сто ");
                        break;
                  case 2:
                        result.append("двести ");
                        break;
                  case 3:
                        result.append("триста ");
                        break;
                  case 4:
                        result.append("четыреста ");
                        break;
                  case 5:
                        result.append("пятьсот ");
                        break;
                  case 6:
                        result.append("шестьсот  ");
                        break;
                  case 7:
                        result.append("семьсот ");
                        break;
                  case 8:
                        result.append("восемьсот ");
                        break;
                  case 9:
                        result.append("девятьсот ");
                        break;
                }
                // Далее, десятки
                rank = (value % 100) / 10;
                switch (rank) {
                  default:
                        break;
                  case 2:
                        result.append("двадцать ");
                        break;
                  case 3:
                        result.append("тридцать ");
                        break;
                  case 4:
                        result.append("сорок ");
                        break;
                  case 5:
                        result.append("пятьдесят ");
                        break;
                  case 6:
                        result.append("шестьдесят ");
                        break;
                  case 7:
                        result.append("семьдесят ");
                        break;
                  case 8:
                        result.append("восемьдесят ");
                        break;
                  case 9:
                        result.append("девяносто ");
                        break;
                }
                // Если десятки = 1, добавить соответствующее значение. Иначе - единицы
                int rank10 = rank;
                rank = value % 10;
                if (rank10 == 1) {
                  switch (rank) {
                        case 0:
                          result.append("десять ");
                          break;
                        case 1:
                          result.append("одиннадцать ");
                          break;
                        case 2:
                          result.append("двенадцать ");
                          break;
                        case 3:
                          result.append("тринадцать ");
                          break;
                        case 4:
                          result.append("четырнадцать ");
                          break;
                        case 5:
                          result.append("пятнадцать ");
                          break;
                        case 6:
                          result.append("шестнадцать ");
                          break;
                        case 7:
                          result.append("семнадцать ");
                          break;
                        case 8:
                          result.append("восемнадцать ");
                          break;
                        case 9:
                          result.append("девятнадцать ");
                          break;
                  }
                }
                else {
                  switch (rank) {
                        default:
                          break;
                        case 1:
                          if (group == 1) { // Тысячи
                                result.append("одна ");
                          }
                          else {
                                // Учесть род валюты (поле "Sex" настроечной информации)
                                if (suff[6].equals("M")) {
                                  result.append("один ");
                                }
                                if (suff[6].equals("F")) {
                                  result.append("одна ");
                                }
                          }
                          break;
                        case 2:
                          if (group == 1) {
                                result.append("две ");
                          } // Тысячи
                          else {
                                // Учесть род валюты (поле "Sex" настроечной информации)
                                if (suff[6].equals("M")) {
                                  result.append("два ");
                                }
                                if (suff[6].equals("F")) {
                                  result.append("две ");
                                }
                          }
                          break;
                        case 3:
                          result.append("три ");
                          break;
                        case 4:
                          result.append("четыре ");
                          break;
                        case 5:
                          result.append("пять ");
                          break;
                        case 6:
                          result.append("шесть ");
                          break;
                        case 7:
                          result.append("семь ");
                          break;
                        case 8:
                          result.append("восемь ");
                          break;
                        case 9:
                          result.append("девять ");
                          break;
                  }
                }
                // Значение группы: тысячи, миллионы и т.д.
                switch (group) {
                  default:
                        break;
                  case 1:
                        if (rank10 == 1) {
                          result.append("тысяч ");
                        }
                        else {
                          switch (rank) {
                                default:
                                  result.append("тысяч ");
                                  break;
                                case 1:
                                  result.append("тысяча ");
                                  break;
                                case 2:
                                case 3:
                                case 4:
                                  result.append("тысячи ");
                                  break;
                          }
                        }
                        break;
                  case 2:
                        if (rank10 == 1) {
                          result.append("миллионов ");
                        }
                        else {
                          switch (rank) {
                                default:
                                  result.append("миллионов ");
                                  break;
                                case 1:
                                  result.append("миллион ");
                                  break;
                                case 2:
                                case 3:
                                case 4:
                                  result.append("миллиона ");
                                  break;
                          }
                        }
                        break;
                  case 3:
                        if (rank10 == 1) {
                          result.append("миллиардов ");
                        }
                        else {
                          switch (rank) {
                                default:
                                  result.append("миллиардов ");
                                  break;
                                case 1:
                                  result.append("миллиард ");
                                  break;
                                case 2:
                                case 3:
                                case 4:
                                  result.append("миллиарда ");
                                  break;
                          }
                        }
                        break;
                  case 4:
                        if (rank10 == 1) {
                          result.append("триллионов ");
                        }
                        else {
                          switch (rank) {
                                default:
                                  result.append("триллионов ");
                                  break;
                                case 1:
                                  result.append("триллион ");
                                  break;
                                case 2:
                                case 3:
                                case 4:
                                  result.append("триллиона ");
                                  break;
                          }
                        }
                        break;
                }
                return result.toString();
          }

}

Sergey Pariev

Comments

There are currently no comments for this snippet.

Voting

Votes Up


Votes Down