From 90188648a300e86afcf5fdc5a945a2498766fcbe Mon Sep 17 00:00:00 2001 From: Patrick Glavin Date: Fri, 13 Apr 2018 10:17:25 -0400 Subject: [PATCH 1/2] prep for convertClass --- src/main/java/io/zipcoder/Problem6.java | 54 +++++++++++++++++++++ src/test/java/io/zipcoder/Problem6Test.java | 17 +++++++ 2 files changed, 71 insertions(+) diff --git a/src/main/java/io/zipcoder/Problem6.java b/src/main/java/io/zipcoder/Problem6.java index 4ee4e64..7c438a8 100644 --- a/src/main/java/io/zipcoder/Problem6.java +++ b/src/main/java/io/zipcoder/Problem6.java @@ -1,4 +1,58 @@ package io.zipcoder; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class Problem6 { + public String militaryTime(String inputTime){ + String result = ""; + String regexFormula = "([0-9]*):([0-9]{2})([ap])"; + Pattern pattern = Pattern.compile(regexFormula); + Matcher matcher = pattern.matcher(inputTime); + int hour = 0; + int minute = 0; + String meridiem = ""; + while (matcher.find()) { + System.out.println(matcher.group(1)); + hour = Integer.parseInt(matcher.group(1)); + System.out.println(matcher.group(2)); + minute = Integer.parseInt(matcher.group(2)); + System.out.println(matcher.group(3)); + meridiem = matcher.group(3); + } + if (meridiem.equals("p")){ + hour += 12; + } + String stringHour = parseHour(hour); + result += stringHour; + return result; + } + + private String parseHour(int number){ + String result = ""; + if (number < 10){ + result += "Zero "; + } + result += parseNumber(number); + return result; + } + + private String parseNumber(int number){ + String numberResult = ""; + switch (number){ + case 1: + numberResult += "One"; + break; + case 2: + numberResult += "Two"; + break; + case 3: + numberResult += "Three"; + break; + case 4: + numberResult += "Four"; + break; + } + return numberResult; + } } diff --git a/src/test/java/io/zipcoder/Problem6Test.java b/src/test/java/io/zipcoder/Problem6Test.java index d262e88..2dd11c0 100644 --- a/src/test/java/io/zipcoder/Problem6Test.java +++ b/src/test/java/io/zipcoder/Problem6Test.java @@ -1,4 +1,21 @@ package io.zipcoder; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + public class Problem6Test { + Problem6 problem6; + + @Before + public void setup(){ + problem6 = new Problem6(); + } + + @Test + public void onethirtyTest(){ + String actual = problem6.militaryTime("1:30am"); + String expected = "Zero One Hundred and Thirty Hours"; + Assert.assertEquals(expected, actual); + } } From 28cfb30e659b661e1cb60c4ebd9ff6ff13295906 Mon Sep 17 00:00:00 2001 From: Patrick Glavin Date: Fri, 13 Apr 2018 10:46:38 -0400 Subject: [PATCH 2/2] full parsing and appending --- src/main/java/io/zipcoder/NumberToWords.java | 135 +++++++++++++++++++ src/main/java/io/zipcoder/Problem6.java | 37 +++-- src/test/java/io/zipcoder/Problem6Test.java | 28 ++++ 3 files changed, 178 insertions(+), 22 deletions(-) create mode 100644 src/main/java/io/zipcoder/NumberToWords.java diff --git a/src/main/java/io/zipcoder/NumberToWords.java b/src/main/java/io/zipcoder/NumberToWords.java new file mode 100644 index 0000000..817837c --- /dev/null +++ b/src/main/java/io/zipcoder/NumberToWords.java @@ -0,0 +1,135 @@ +package io.zipcoder; + +import java.text.DecimalFormat; + +public class NumberToWords { + + private static final String[] tensNames = { + "", + " Ten", + " Twenty", + " Thirty", + " Forty", + " Fifty", + " Sixty", + " Seventy", + " Eighty", + " Ninety" + }; + + private static final String[] numNames = { + "", + " One", + " Two", + " Three", + " Four", + " Five", + " Six", + " Seven", + " Eight", + " Nine", + " Ten", + " Eleven", + " Twelve", + " Thirteen", + " Fourteen", + " Fifteen", + " Sixteen", + " Seventeen", + " Eighteen", + " Nineteen" + }; + + public NumberToWords() {} + + private static String convertLessThanOneThousand(int number) { + String soFar; + + if (number % 100 < 20){ + soFar = numNames[number % 100]; + number /= 100; + } + else { + soFar = numNames[number % 10]; + number /= 10; + + soFar = tensNames[number % 10] + soFar; + number /= 10; + } + if (number == 0) return soFar; + return numNames[number] + " Hundred" + soFar; + } + + + public static String convert(long number) { + // 0 to 999 999 999 999 + if (number == 0) { return "Zero"; } + + String snumber = Long.toString(number); + + // pad with "0" + String mask = "000000000000"; + DecimalFormat df = new DecimalFormat(mask); + snumber = df.format(number); + + // XXXnnnnnnnnn + int billions = Integer.parseInt(snumber.substring(0,3)); + // nnnXXXnnnnnn + int millions = Integer.parseInt(snumber.substring(3,6)); + // nnnnnnXXXnnn + int hundredThousands = Integer.parseInt(snumber.substring(6,9)); + // nnnnnnnnnXXX + int thousands = Integer.parseInt(snumber.substring(9,12)); + + String tradBillions; + switch (billions) { + case 0: + tradBillions = ""; + break; + case 1 : + tradBillions = convertLessThanOneThousand(billions) + + " billion "; + break; + default : + tradBillions = convertLessThanOneThousand(billions) + + " billion "; + } + String result = tradBillions; + + String tradMillions; + switch (millions) { + case 0: + tradMillions = ""; + break; + case 1 : + tradMillions = convertLessThanOneThousand(millions) + + " million "; + break; + default : + tradMillions = convertLessThanOneThousand(millions) + + " million "; + } + result = result + tradMillions; + + String tradHundredThousands; + switch (hundredThousands) { + case 0: + tradHundredThousands = ""; + break; + case 1 : + tradHundredThousands = "one thousand "; + break; + default : + tradHundredThousands = convertLessThanOneThousand(hundredThousands) + + " thousand "; + } + result = result + tradHundredThousands; + + String tradThousand; + tradThousand = convertLessThanOneThousand(thousands); + result = result + tradThousand; + + // remove extra spaces! + return result.replaceAll("^\\s+", "").replaceAll("\\b\\s{2,}\\b", " "); + } +} diff --git a/src/main/java/io/zipcoder/Problem6.java b/src/main/java/io/zipcoder/Problem6.java index 7c438a8..b1b4327 100644 --- a/src/main/java/io/zipcoder/Problem6.java +++ b/src/main/java/io/zipcoder/Problem6.java @@ -4,6 +4,7 @@ import java.util.regex.Pattern; public class Problem6 { + public String militaryTime(String inputTime){ String result = ""; String regexFormula = "([0-9]*):([0-9]{2})([ap])"; @@ -13,18 +14,17 @@ public String militaryTime(String inputTime){ int minute = 0; String meridiem = ""; while (matcher.find()) { - System.out.println(matcher.group(1)); hour = Integer.parseInt(matcher.group(1)); - System.out.println(matcher.group(2)); minute = Integer.parseInt(matcher.group(2)); - System.out.println(matcher.group(3)); meridiem = matcher.group(3); } if (meridiem.equals("p")){ hour += 12; } - String stringHour = parseHour(hour); - result += stringHour; + result += parseHour(hour); + result += "Hundred "; + result += parseMinute(minute); + result += " Hours"; return result; } @@ -33,26 +33,19 @@ private String parseHour(int number){ if (number < 10){ result += "Zero "; } - result += parseNumber(number); + result += NumberToWords.convert(number) + " "; return result; } - private String parseNumber(int number){ - String numberResult = ""; - switch (number){ - case 1: - numberResult += "One"; - break; - case 2: - numberResult += "Two"; - break; - case 3: - numberResult += "Three"; - break; - case 4: - numberResult += "Four"; - break; + private String parseMinute(int minute){ + String result = ""; + if (minute < 10){ + result += "Zero "; + } else { + result += "and "; } - return numberResult; + result += NumberToWords.convert(minute); + return result; } + } diff --git a/src/test/java/io/zipcoder/Problem6Test.java b/src/test/java/io/zipcoder/Problem6Test.java index 2dd11c0..a2f410f 100644 --- a/src/test/java/io/zipcoder/Problem6Test.java +++ b/src/test/java/io/zipcoder/Problem6Test.java @@ -18,4 +18,32 @@ public void onethirtyTest(){ String expected = "Zero One Hundred and Thirty Hours"; Assert.assertEquals(expected, actual); } + + @Test + public void oneThirtyPmTest(){ + String actual = problem6.militaryTime("1:30pm"); + String expected = "Thirteen Hundred and Thirty Hours"; + Assert.assertEquals(expected, actual); + } + + @Test + public void fiveFourtyFivePmTest(){ + String actual = problem6.militaryTime("5:45pm"); + String expected = "Seventeen Hundred and Forty Five Hours"; + Assert.assertEquals(expected, actual); + } + + @Test + public void tenOhTwoAmTest(){ + String actual = problem6.militaryTime("10:02am"); + String expected = "Ten Hundred Zero Two Hours"; + Assert.assertEquals(expected, actual); + } + + @Test + public void twoElevenAmTest(){ + String actual = problem6.militaryTime("2:11am"); + String expected = "Zero Two Hundred and Eleven Hours"; + Assert.assertEquals(expected, actual); + } }