Advertisement
cyecize

Number Speller

Mar 31st, 2022
912
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.41 KB | None | 0 0
  1. package com.cyecize.app;
  2.  
  3. import java.util.Arrays;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Scanner;
  8.  
  9. public class StartUp {
  10.  
  11.     static final Map<Integer, String> numbersMapping = new HashMap<>() {{
  12.         put(0, "Zero");
  13.         put(1, "One");
  14.         put(2, "Two");
  15.         put(3, "Three");
  16.         put(4, "Four");
  17.         put(5, "Five");
  18.         put(6, "Six");
  19.         put(7, "Seven");
  20.         put(8, "Eight");
  21.         put(9, "Nine");
  22.         put(10, "Ten");
  23.         put(11, "Eleven");
  24.         put(12, "Twelve");
  25.         put(13, "Thirteen");
  26.         put(14, "Fourteen");
  27.         put(15, "Fifteen");
  28.         put(16, "Sixteen");
  29.         put(17, "Seventeen");
  30.         put(18, "Eighteen");
  31.         put(19, "Nineteen");
  32.         put(20, "Twenty");
  33.         put(30, "Thirty");
  34.         put(40, "Forty");
  35.         put(50, "Fifty");
  36.         put(60, "Sixty");
  37.         put(70, "Seventy");
  38.         put(80, "Eighty");
  39.         put(90, "Ninety");
  40.     }};
  41.  
  42.     public static void main(String[] args) {
  43.         Scanner scanner = new Scanner(System.in);
  44.  
  45.         while (true) {
  46.             String line = scanner.nextLine();
  47.             if ("end".equalsIgnoreCase(line)) break;
  48.  
  49.             int number = Integer.parseInt(line);
  50.             System.out.println(spellNumber(number));
  51.         }
  52.     }
  53.  
  54.     static String spellNumber(Integer num) {
  55.         if (num < 0) {
  56.             return "Minus " + spellNumber(Math.abs(num));
  57.         }
  58.         if (numbersMapping.containsKey(num)) {
  59.             return numbersMapping.get(num);
  60.         }
  61.  
  62.         int numLength = num.toString().length();
  63.         if (NumberSuffix.hasSuffix(numLength)) {
  64.             NumberSuffix suffix = NumberSuffix.getSuffix(numLength);
  65.  
  66.             int numberChunk = num / suffix.division;
  67.             int leftover = num % suffix.division;
  68.  
  69.             String numberName = spellNumber(numberChunk) + " " + suffix.suffix;
  70.             if (leftover == 0) {
  71.                 return numberName;
  72.             }
  73.  
  74.             if (leftover < 100 && num >= 100) {
  75.                 numberName += " and";
  76.             }
  77.  
  78.             return numberName + " " + spellNumber(leftover);
  79.         }
  80.  
  81.         //Code is only reachable for numbers in range from 21 to 99
  82.         if (num > 99) {
  83.             return "Number too big!";
  84.         }
  85.  
  86.         int decimalRounded = num / 10 * 10;
  87.         int leftover = num % 10;
  88.  
  89.         String numberName = spellNumber(decimalRounded);
  90.         if (leftover == 0) {
  91.             return numberName;
  92.         }
  93.  
  94.         return numberName + " " + spellNumber(leftover);
  95.     }
  96.  
  97.     static enum NumberSuffix {
  98.         HUNDRED(List.of(3), "Hundred", 100),
  99.         THOUSAND(List.of(4, 5, 6), "Thousand", 1000),
  100.         MILLION(List.of(7), "Million", 1000000);
  101.  
  102.         final List<Integer> numLengths;
  103.         final String suffix;
  104.         final int division;
  105.  
  106.         NumberSuffix(List<Integer> numLengths, String suffix, int division) {
  107.             this.numLengths = numLengths;
  108.             this.suffix = suffix;
  109.             this.division = division;
  110.         }
  111.  
  112.         static NumberSuffix getSuffix(int numLength) {
  113.             return Arrays.stream(values()).filter(val -> val.numLengths.contains(numLength)).findFirst().orElse(null);
  114.         }
  115.  
  116.         static boolean hasSuffix(int numLenght) {
  117.             return getSuffix(numLenght) != null;
  118.         }
  119.     }
  120. }
  121.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement