fork download
  1. package com.konstantin;
  2.  
  3.  
  4. import java.io.BufferedReader;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. import java.math.BigInteger;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. import java.util.Objects;
  12.  
  13. public class ConverterNumToWords {
  14.  
  15. private final static String PATH_FILE = "dataName/nameUnits.txt";
  16. private final static int MALE_GENDER = 1;
  17. private final static int FEMALE_GENDER = -1;
  18. private final static String SEPARATOR = " ";
  19.  
  20. private static final Map<Integer, String> nameTriad = new HashMap<Integer, String>() {{
  21. put(-2, "две");
  22. put(-1, "одна");
  23. put(0, "ноль");
  24. put(1, "один");
  25. put(2, "два");
  26. put(3, "три");
  27. put(4, "четыре");
  28. put(5, "пять");
  29. put(6, "шесть");
  30. put(7, "семь");
  31. put(8, "восемь");
  32. put(9, "девять");
  33. put(10, "десять");
  34. put(11, "одиннадцать");
  35. put(12, "двенадцать");
  36. put(13, "тринадцать");
  37. put(14, "четырнадцать");
  38. put(15, "пятнадцать");
  39. put(16, "шестнадцать");
  40. put(17, "семнадцать");
  41. put(18, "восемнадцать");
  42. put(19, "девятнадцать");
  43. put(20, "двадцать");
  44. put(30, "тридцать");
  45. put(40, "сорок");
  46. put(50, "пятьдесят");
  47. put(60, "шестьдесят");
  48. put(70, "семьдесят");
  49. put(80, "восемьдесят");
  50. put(90, "девяносто");
  51. put(100, "сто");
  52. put(200, "двести");
  53. put(300, "триста");
  54. put(400, "четыреста");
  55. put(500, "пятьсот");
  56. put(600, "шестьсот");
  57. put(700, "семьсот");
  58. put(800, "восемьсот");
  59. put(900, "девятьсот");
  60.  
  61. }};
  62.  
  63. private Map<Integer, String> nameUnits = new HashMap<Integer, String>() {{
  64. put(1, "тысяч");
  65. }};
  66.  
  67. private final String[][] endings = {{"а", "и", ""}, {"", "а", "ов"}};
  68.  
  69.  
  70. public ConverterNumToWords() {
  71.  
  72. readNameUnitFromFile();
  73.  
  74. }
  75.  
  76. private void readNameUnitFromFile() {
  77. new FileInputStream(PATH_FILE), "UTF8"))) {
  78. String tmpLineStr;
  79. String Units[];
  80. while ((tmpLineStr = br.readLine()) != null) {
  81. if (!Objects.equals(tmpLineStr , "")) {
  82. Units = tmpLineStr.split(SEPARATOR);
  83. nameUnits.put(Integer.valueOf(Units[0]), Units[1]);
  84. }
  85. }
  86.  
  87.  
  88. } catch (IOException ex) {
  89. throw new RuntimeException(ex);
  90. }
  91. }
  92.  
  93. private String convertTriad(String triad, int gender) {
  94. int hundreds = Character.getNumericValue(triad.charAt(0));
  95. int dozens = Character.getNumericValue(triad.charAt(1));
  96. int units = Character.getNumericValue(triad.charAt(2));
  97. if (Objects.equals(triad, "000")) return "";
  98. String words = "";
  99. if (hundreds != 0)
  100. words += nameTriad.get(hundreds * 100) + SEPARATOR;
  101. if (dozens == 1 && units <= 9 && units >= 0) //Для чисел от 10 до 19 ключи для мапа считаются отдельно
  102. words += nameTriad.get(dozens * 10 + units) + SEPARATOR;
  103. else {
  104. if (dozens != 0)
  105. words += nameTriad.get(dozens * 10) + SEPARATOR;
  106. if (units != 0 && units > 2)
  107. words += nameTriad.get(units) + SEPARATOR;
  108. else if (units != 0 && units <= 2)
  109. words += nameTriad.get(units * gender) + SEPARATOR;
  110. }
  111. return words;
  112. }
  113.  
  114. /**
  115.   * Получаем номер окончания для названия из мап nameUnit, основываясь на числе n ,в массиве ending
  116.   */
  117. private int selectForm(int n) {
  118. n = Math.abs(n) % 100;
  119. int n1 = n % 10;
  120. if (n > 10 && n < 20) return 2;
  121. if (n1 > 1 && n1 < 5) return 1;
  122. if (n1 == 1) return 0;
  123. return 2;
  124. }
  125.  
  126. private String getFormNameUnit(int degree, String number) {
  127. if (nameUnits.get(degree) == null && degree != 0) throw new NullPointerException("Dont exist name " +
  128. degree + " thousands of degrees");
  129. if (Objects.equals(number, "000")) return "";
  130. if (degree == 1) return nameUnits.get(degree) + endings[0][selectForm(Integer.parseInt(number))] + SEPARATOR;
  131. if (degree > 1) return nameUnits.get(degree) + endings[1][selectForm(Integer.parseInt(number))] + SEPARATOR;
  132. else
  133. return "";
  134. }
  135.  
  136. /**
  137.   * Конвертирует число number в запись словами
  138.   */
  139. public String convertNumbToWords(BigInteger number) {
  140. String numberStr = number.toString();
  141.  
  142. if (Objects.equals(numberStr, "0")) return nameTriad.get(0);
  143.  
  144. String nameNumber = "";
  145.  
  146. if (numberStr.charAt(0) == '-') {
  147. nameNumber += "минус ";
  148. numberStr = numberStr.substring(1);
  149. }
  150.  
  151. for (int i = 0; i < numberStr.length() % 3; i++)
  152. numberStr = "0" + numberStr;
  153.  
  154. for (int i = 0; i < numberStr.length() / 3; i++) {
  155. int degree = numberStr.length() / 3 - i - 1;
  156. if (degree == 1)
  157. nameNumber += convertTriad(numberStr.substring((i * 3), i * 3 + 3), FEMALE_GENDER) +
  158. getFormNameUnit(degree, numberStr.substring((i * 3), i * 3 + 3));
  159. else
  160. nameNumber += convertTriad(numberStr.substring((i * 3), i * 3 + 3), MALE_GENDER) +
  161. getFormNameUnit(degree, numberStr.substring((i * 3), i * 3 + 3));
  162. }
  163. return nameNumber.trim();
  164. }
  165.  
  166.  
  167. }
  168.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Main.java:13: error: class ConverterNumToWords is public, should be declared in a file named ConverterNumToWords.java
public class ConverterNumToWords {
       ^
1 error
stdout
Standard output is empty