package net.sf.lab3f.util; import java.util.Stack; public class RussianMoney { private static enum Ranges {UNITS, DECADES, HUNDREDS, THOUSANDS, MILLIONS, BILLIONS}; private static Stack <ThreeChar> threeChars; private static class ThreeChar { char h, d, u; Ranges range; } public static String digits2Text(Double d){ if(d == null || d < 0.0) return null; String s = d.toString(); int n = s.length() - s.lastIndexOf('.'); if(n > 3) return null; if(n == 2) s += "0"; String[] sa = s.split("\\."); threeChars = new Stack <ThreeChar> (); threeChars.push(new ThreeChar()); threeChars.peek().range = Ranges.UNITS; StringBuilder sb = new StringBuilder(sa[0]).reverse(); for(int i = 0; i < sb.length(); i++){ if(i > 0 && i % 3 == 0){ threeChars.push(new ThreeChar()); } ThreeChar threeChar = threeChars.peek(); switch(i){ case 0: threeChar.u = sb.charAt(i); break; case 3: threeChar.range = Ranges.THOUSANDS; threeChar.u = sb.charAt(i); break; case 6: threeChar.range = Ranges.MILLIONS; threeChar.u = sb.charAt(i); break; case 9: threeChar.range = Ranges.BILLIONS; threeChar.u = sb.charAt(i); break; case 2: case 5: case 8: threeChar.h = sb.charAt(i); break; default: threeChar.d = sb.charAt(i); } } StringBuilder result = new StringBuilder(); while(!threeChars.isEmpty()){ ThreeChar thch = threeChars.pop(); if(thch.h > 0 ){ result.append(getHundreds(thch.h)); result.append(' '); } if(thch.d > '0'){ if(thch.d > '1' || (thch.d == '1' && thch.u == '0')) result.append(getDecades(thch.d)); else if(thch.d > '0') result.append(getTeens(thch.d)); result.append(' '); } if(thch.u > '0' && thch.d != '1'){ result.append(getUnits(thch.u, thch.range == Ranges.THOUSANDS)); result.append(' '); } switch(thch.range){ case BILLIONS: if(thch.d == '1' || thch.u == '0') result.append("миллиардов"); else if(thch.u > '4')result.append("миллиардов"); else if(thch.u > '1')result.append("миллиарда"); else result.append("миллиард"); break; case MILLIONS: if(thch.d == '1' || thch.u == '0') result.append("миллионов"); else if(thch.u > '4')result.append("миллионов"); else if(thch.u > '1')result.append("миллиона"); else result.append("миллион"); break; case THOUSANDS: if(thch.d == '1' || thch.u == '0') result.append("тысяч"); else if(thch.u > '4')result.append("тысяч"); else if(thch.u > '1')result.append("тысячи"); else result.append("тысяча"); break; default: if(thch.d == '1' || thch.u == '0' || thch.u > '4')result.append("рублей"); else if(thch.u > '1')result.append("рубля"); else result.append("рубль"); } result.append(' '); } result.append(sa[1] + ' '); switch(sa[1].charAt(1)){ case '1': result.append(sa[1].charAt(0) != '1' ? "копейка" : "копеек"); break; case '2': case '3': case '4': result.append(sa[1].charAt(0) != '1' ? "копейки" : "копеек"); break; default: result.append("копеек"); } char first = Character.toUpperCase(result.charAt(0)); result.setCharAt(0, first); return result.toString(); } private static String getHundreds(char dig){ switch(dig){ case '1': return "сто"; case '2': return "двести"; case '3': return "триста"; case '4': return "четыреста"; case '5': return "пятьсот"; case '6': return "шестсот"; case '7': return "семсот"; case '8': return "восемсот"; case '9': return "девятьсот"; default: return null; } } private static String getDecades(char dig){ switch(dig){ case '1': return "десять"; case '2': return "двадцать"; case '3': return "тридцать"; case '4': return "сорок"; case '5': return "пятьдесят"; case '6': return "шестьдесят"; case '7': return "семьдесят"; case '8': return "восемьдесят"; case '9': return "девяносто"; default: return null; } } private static String getUnits(char dig, boolean female){ switch(dig){ case '1': return female ? "одна" : "один"; case '2': return female ? "две" : "два"; case '3': return "три"; case '4': return "четыре"; case '5': return "пять"; case '6': return "шесть"; case '7': return "семь"; case '8': return "восемь"; case '9': return "девять"; default: return null; } } private static String getTeens(char dig){ String s = ""; switch(dig){ case '1': s = "один"; break; case '2': s = "две"; break; case '3': s = "три"; break; case '4': s = "четыр"; break; case '5': s = "пят"; break; case '6': s = "шест"; break; case '7': s = "сем"; break; case '8': s = "восем"; break; case '9': s = "девят"; break; } return s + "надцать"; } public static void main(String[] args){ System.out.println(new RussianMoney().digits2Text(new Double(args[0]))); } }