Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
135 changes: 135 additions & 0 deletions src/main/java/io/zipcoder/NumberToWords.java
Original file line number Diff line number Diff line change
@@ -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", " ");
}
}
47 changes: 47 additions & 0 deletions src/main/java/io/zipcoder/Problem6.java
Original file line number Diff line number Diff line change
@@ -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;
}

}
45 changes: 45 additions & 0 deletions src/test/java/io/zipcoder/Problem6Test.java
Original file line number Diff line number Diff line change
@@ -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);
}
}