Сумма прописью по русски
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();
}
}






There are currently no comments for this snippet.