/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
private static final String[] NUM_NAMES
= { "",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine" };
private static final String[] TEEN_NAMES
= { "",
"eleven",
"twelve",
"thirteen",
"fourteen",
"fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
private static final String[] TENS_NAMES
= { "",
"ten",
"twenty",
"thirty",
"forty",
"fifty",
"sixty", "seventy", "eighty", "ninety" };
private static int getRemainder(int dividend, int i, int k) {
return ((dividend
% (int) Math.
pow(10,
(i
))) - (dividend
% (int) Math.
pow(10,
(k
)))) / (int) Math.
pow(10,
(k
)); }
/*
* The method convertNumToText is capable of evaluating numbers up to 999,999,999 and
* translating them into their readable English equivalent.
*/
private static String convertNumToText
(int num
) { // Uses StringBuilder to append values instead of String concatenation
StringBuilder str = new StringBuilder();
// Calculates the logarithmic value for the number entered
int length
= (int) (Math.
log10(num
)); // Placeholder variable for the result of modulus calculations
int remainder;
// Catches if the number being parsed is 0 and returns "zero"
if (num == 0) {
return "zero";
}
/*
* This For Loop isolates every digit of the number entered,
* and appends the English value into a string
*/
for (int i = length; i >= 0; i--) {
/*
* Isolates the highest-level digit using modulus
* e.g. : ((4321%10^4) - (4321%10^3) / 10^3)
* = ((4000) - (321)) / 1000
* = 4
*/
remainder = getRemainder(num, i + 1, i);
/*
* IF the digits place is tens AND the value is not 10 (11-19) then apply the nomenclature of
* TEEN_NAMES
*
* ELSE if the digits place is tens and 10,20,30... then apply the nomenclature TEN_NAMES
*
* ELSE if no special nomenclature is required, just apply regular nomenclature NUM_NAMES
*/
if ((i == 1 || i == 4 || i == 7) && (remainder == 1 && ((10 + getRemainder(num, i, i - 1) != 10)))) {
str.append(TEEN_NAMES[getRemainder(num, i, i - 1)]);
i--; // Skip the ones value, since the TEENS naming consumes both tens and ones
} else if (i == 1 || i == 4 || i == 7) {
str.append(TENS_NAMES[remainder]);
if (getRemainder(num, i, i - 1) != 0 && getRemainder(num, i+1, i) != 0) {
str.append("-"); // If the value of the ones is not zero, then append a dash
}
} else {
str.append(NUM_NAMES[remainder]);
}
/*
* If the digit places is hundreds, then apply suffix of "hundred"
*
* This is not a part of the thousand/million statements because those only have one
* placeholder and hundred has multiple
*/
if (remainder > 0 && (i == 2 || i == 5 || i == 8)) {
str.append(" hundred ");
}
/*
* IF the digits place is thousands, then apply suffix "thousand"
*
* ELSE IF the digits place is millions, then apply suffix "million"
*
* New line added for readability.
*/
if (i == 3) {
str.append(" thousand,\n");
} else if (i == 6) {
str.append(" million,\n");
}
// For debugging purposes
//System.out.println(remainder + " " + i);
}
// Converts the StringBuilder str into a string and returns the value
return str.toString();
}
{
System.
out.
println(convertNumToText
(231242)); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXQlOVU1fTkFNRVMJPSB7ICIiLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiIH07CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10JVEVFTl9OQU1FUwk9IHsgIiIsICJlbGV2ZW4iLCAidHdlbHZlIiwgInRoaXJ0ZWVuIiwgImZvdXJ0ZWVuIiwKCQkJImZpZnRlZW4iLCAic2l4dGVlbiIsICJzZXZlbnRlZW4iLCAiZWlnaHRlZW4iLCAibmluZXRlZW4iIH07CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10JVEVOU19OQU1FUwk9IHsgIiIsICJ0ZW4iLCAidHdlbnR5IiwgInRoaXJ0eSIsICJmb3J0eSIsICJmaWZ0eSIsCgkJCSJzaXh0eSIsICJzZXZlbnR5IiwgImVpZ2h0eSIsICJuaW5ldHkiIH07CgoJcHJpdmF0ZSBzdGF0aWMgaW50IGdldFJlbWFpbmRlcihpbnQgZGl2aWRlbmQsIGludCBpLCBpbnQgaykgewoJCXJldHVybiAoKGRpdmlkZW5kICUgKGludCkgTWF0aC5wb3coMTAsIChpKSkpIC0gKGRpdmlkZW5kICUgKGludCkgTWF0aC5wb3coMTAsIChrKSkpKQoJCQkJLyAoaW50KSBNYXRoLnBvdygxMCwgKGspKTsKCX0KCgkvKgoJICogVGhlIG1ldGhvZCBjb252ZXJ0TnVtVG9UZXh0IGlzIGNhcGFibGUgb2YgZXZhbHVhdGluZyBudW1iZXJzIHVwIHRvIDk5OSw5OTksOTk5IGFuZAoJICogdHJhbnNsYXRpbmcgdGhlbSBpbnRvIHRoZWlyIHJlYWRhYmxlIEVuZ2xpc2ggZXF1aXZhbGVudC4KCSAqLwoJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnROdW1Ub1RleHQoaW50IG51bSkgewoJCS8vIFVzZXMgU3RyaW5nQnVpbGRlciB0byBhcHBlbmQgdmFsdWVzIGluc3RlYWQgb2YgU3RyaW5nIGNvbmNhdGVuYXRpb24KCQlTdHJpbmdCdWlsZGVyIHN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CgkJLy8gQ2FsY3VsYXRlcyB0aGUgbG9nYXJpdGhtaWMgdmFsdWUgZm9yIHRoZSBudW1iZXIgZW50ZXJlZAoJCWludCBsZW5ndGggPSAoaW50KSAoTWF0aC5sb2cxMChudW0pKTsKCQkvLyBQbGFjZWhvbGRlciB2YXJpYWJsZSBmb3IgdGhlIHJlc3VsdCBvZiBtb2R1bHVzIGNhbGN1bGF0aW9ucwoJCWludCByZW1haW5kZXI7CgoJCS8vIENhdGNoZXMgaWYgdGhlIG51bWJlciBiZWluZyBwYXJzZWQgaXMgMCBhbmQgcmV0dXJucyAiemVybyIKCQlpZiAobnVtID09IDApIHsKCQkJcmV0dXJuICJ6ZXJvIjsKCQl9CgoJCS8qCgkJICogVGhpcyBGb3IgTG9vcCBpc29sYXRlcyBldmVyeSBkaWdpdCBvZiB0aGUgbnVtYmVyIGVudGVyZWQsCgkJICogYW5kIGFwcGVuZHMgdGhlIEVuZ2xpc2ggdmFsdWUgaW50byBhIHN0cmluZwoJCSAqLwoJCWZvciAoaW50IGkgPSBsZW5ndGg7IGkgPj0gMDsgaS0tKSB7CgoJCQkvKgoJCQkgKiBJc29sYXRlcyB0aGUgaGlnaGVzdC1sZXZlbCBkaWdpdCB1c2luZyBtb2R1bHVzCgkJCSAqIGUuZy4gOiAoKDQzMjElMTBeNCkgLSAoNDMyMSUxMF4zKSAvIDEwXjMpCgkJCSAqID0gKCg0MDAwKSAtICgzMjEpKSAvIDEwMDAKCQkJICogPSA0CgkJCSAqLwoJCQlyZW1haW5kZXIgPSBnZXRSZW1haW5kZXIobnVtLCBpICsgMSwgaSk7CgoJCQkvKgoJCQkgKiBJRiB0aGUgZGlnaXRzIHBsYWNlIGlzIHRlbnMgQU5EIHRoZSB2YWx1ZSBpcyBub3QgMTAgKDExLTE5KSB0aGVuIGFwcGx5IHRoZSBub21lbmNsYXR1cmUgb2YKCQkJICogVEVFTl9OQU1FUwoJCQkgKiAKCQkJICogRUxTRSBpZiB0aGUgZGlnaXRzIHBsYWNlIGlzIHRlbnMgYW5kIDEwLDIwLDMwLi4uIHRoZW4gYXBwbHkgdGhlIG5vbWVuY2xhdHVyZSBURU5fTkFNRVMKCQkJICogCgkJCSAqIEVMU0UgaWYgbm8gc3BlY2lhbCBub21lbmNsYXR1cmUgaXMgcmVxdWlyZWQsIGp1c3QgYXBwbHkgcmVndWxhciBub21lbmNsYXR1cmUgTlVNX05BTUVTCgkJCSAqLwoJCQlpZiAoKGkgPT0gMSB8fCBpID09IDQgfHwgaSA9PSA3KSAmJiAocmVtYWluZGVyID09IDEgJiYgKCgxMCArIGdldFJlbWFpbmRlcihudW0sIGksIGkgLSAxKSAhPSAxMCkpKSkgewoJCQkJc3RyLmFwcGVuZChURUVOX05BTUVTW2dldFJlbWFpbmRlcihudW0sIGksIGkgLSAxKV0pOwoJCQkJaS0tOyAvLyBTa2lwIHRoZSBvbmVzIHZhbHVlLCBzaW5jZSB0aGUgVEVFTlMgbmFtaW5nIGNvbnN1bWVzIGJvdGggdGVucyBhbmQgb25lcwoJCQl9IGVsc2UgaWYgKGkgPT0gMSB8fCBpID09IDQgfHwgaSA9PSA3KSB7CgkJCQlzdHIuYXBwZW5kKFRFTlNfTkFNRVNbcmVtYWluZGVyXSk7CgkJCQlpZiAoZ2V0UmVtYWluZGVyKG51bSwgaSwgaSAtIDEpICE9IDAgJiYgZ2V0UmVtYWluZGVyKG51bSwgaSsxLCBpKSAhPSAwKSB7CgkJCQkJc3RyLmFwcGVuZCgiLSIpOyAvLyBJZiB0aGUgdmFsdWUgb2YgdGhlIG9uZXMgaXMgbm90IHplcm8sIHRoZW4gYXBwZW5kIGEgZGFzaAoJCQkJfQoJCQl9IGVsc2UgewoJCQkJc3RyLmFwcGVuZChOVU1fTkFNRVNbcmVtYWluZGVyXSk7CgkJCX0KCgkJCS8qCgkJCSAqIElmIHRoZSBkaWdpdCBwbGFjZXMgaXMgaHVuZHJlZHMsIHRoZW4gYXBwbHkgc3VmZml4IG9mICJodW5kcmVkIgoJCQkgKiAKCQkJICogVGhpcyBpcyBub3QgYSBwYXJ0IG9mIHRoZSB0aG91c2FuZC9taWxsaW9uIHN0YXRlbWVudHMgYmVjYXVzZSB0aG9zZSBvbmx5IGhhdmUgb25lCgkJCSAqIHBsYWNlaG9sZGVyIGFuZCBodW5kcmVkIGhhcyBtdWx0aXBsZQoJCQkgKi8KCQkJaWYgKHJlbWFpbmRlciA+IDAgJiYgKGkgPT0gMiB8fCBpID09IDUgfHwgaSA9PSA4KSkgewoJCQkJc3RyLmFwcGVuZCgiIGh1bmRyZWQgIik7CgkJCX0KCgkJCS8qCgkJCSAqIElGIHRoZSBkaWdpdHMgcGxhY2UgaXMgdGhvdXNhbmRzLCB0aGVuIGFwcGx5IHN1ZmZpeCAidGhvdXNhbmQiCgkJCSAqIAoJCQkgKiBFTFNFIElGIHRoZSBkaWdpdHMgcGxhY2UgaXMgbWlsbGlvbnMsIHRoZW4gYXBwbHkgc3VmZml4ICJtaWxsaW9uIgoJCQkgKiAKCQkJICogTmV3IGxpbmUgYWRkZWQgZm9yIHJlYWRhYmlsaXR5LgoJCQkgKi8KCQkJaWYgKGkgPT0gMykgewoJCQkJc3RyLmFwcGVuZCgiIHRob3VzYW5kLFxuIik7CgkJCX0gZWxzZSBpZiAoaSA9PSA2KSB7CgkJCQlzdHIuYXBwZW5kKCIgbWlsbGlvbixcbiIpOwoJCQl9CgkJCS8vIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4ocmVtYWluZGVyICsgIiAiICsgaSk7CgkJfQoJCS8vIENvbnZlcnRzIHRoZSBTdHJpbmdCdWlsZGVyIHN0ciBpbnRvIGEgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSB2YWx1ZQoJCXJldHVybiBzdHIudG9TdHJpbmcoKTsKCX0KCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoKCVN5c3RlbS5vdXQucHJpbnRsbihjb252ZXJ0TnVtVG9UZXh0KDIzMTI0MikpOwoJfQp9