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 4ee4e64..b1b4327 100644 --- a/src/main/java/io/zipcoder/Problem6.java +++ b/src/main/java/io/zipcoder/Problem6.java @@ -1,4 +1,51 @@ 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()) { + hour = Integer.parseInt(matcher.group(1)); + minute = Integer.parseInt(matcher.group(2)); + meridiem = matcher.group(3); + } + if (meridiem.equals("p")){ + hour += 12; + } + result += parseHour(hour); + result += "Hundred "; + result += parseMinute(minute); + result += " Hours"; + return result; + } + + private String parseHour(int number){ + String result = ""; + if (number < 10){ + result += "Zero "; + } + result += NumberToWords.convert(number) + " "; + return result; + } + + private String parseMinute(int minute){ + String result = ""; + if (minute < 10){ + result += "Zero "; + } else { + result += "and "; + } + 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 d262e88..a2f410f 100644 --- a/src/test/java/io/zipcoder/Problem6Test.java +++ b/src/test/java/io/zipcoder/Problem6Test.java @@ -1,4 +1,49 @@ 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); + } + + @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); + } }