將數字轉為英文組合
public with sharing class ext_NumberToWord {
static String[] to_19 = new string[]{ ' ', 'one', 'two', 'three', 'four', 'five', 'six',
'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen',
'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen' };
static String[] tens = new string[]{ 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'};
static String[] denom = new string[]{ '',
'thousand', 'million', 'billion', 'trillion', 'quadrillion',
'quintillion', 's!xtillion', 'septillion', 'octillion', 'nonillion',
'decillion', 'undecillion', 'duodecillion', 'tredecillion', 'quattuordecillion',
's!xdecillion', 'septendecillion', 'octodecillion', 'novemdecillion', 'vigintillion' };
// convert a value < 100 to English.
public static String convert_nn(decimal input) {
decimal Deci_val = input - integer.valueOf(input);
integer val = integer.valueof(input);
if(Deci_val == 0){
if (val < 20)
return to_19[val];
if(val == 100)
return 'One Hundred';
for (integer v = 0; v < tens.size(); v++) {
String dcap = tens[v];
integer dval = 20 + 10 * v;
if (dval + 10 > val) {
if (Math.Mod(val,10) != 0)
return dcap + ' ' + to_19[Math.Mod(val,10)];
return dcap;
}
}
}
else{
string CENTS;
if(integer.valueOf(Deci_val * 100)<20)
{
CENTS = to_19[integer.valueOf(Deci_val * 100)];
}
else
{
CENTS = tens[integer.valueOf(integer.valueOf(Deci_val * 100)/10)-2] + ' ' + to_19[Math.Mod(integer.valueOf(Deci_val * 100),10)];
}
if (val <= 10)
return 'and ' + to_19[val] + ' and ' + CENTS + ' cents';
if (val < 20)
return to_19[val] + ' and ' + CENTS + ' cents';
if(val == 100)
return 'One Hundred'+ ' and ' + CENTS + ' cents';
for (integer v = 0; v < tens.size(); v++) {
String dcap = tens[v];
integer dval = 20 + 10 * v;
if (dval + 10 > val) {
if (Math.Mod(val,10) != 0)
return dcap + ' ' + to_19[Math.Mod(val,10)] + ' and ' + CENTS + ' cents';
return dcap + ' and ' + CENTS + ' cents';
}
}
}
return 'Should never get here, less than 100 failure';
}
// convert a value < 1000 to english, special cased because it is the level that kicks
// off the < 100 special case. The rest are more general. This also allows you to
// get strings in the form of "forty-five hundred" if called directly.
public static String convert_nnn(decimal input) {
decimal Deci_val = input - integer.valueOf(input);
integer val = integer.valueof(input);
String word = '';
integer rem = val / 100;
integer mod = Math.mod(val,100);
if (rem > 0 && Deci_val == 0) {
word = to_19[rem] + ' hundred';
if (mod > 0) {
word += ' ';
}
}
else if (rem > 0 && Deci_val != 0) {
word = to_19[rem] + ' hundred';
if (mod > 0) {
word += ' ';
}
}
if (mod >= 0) {
word += convert_nn(input - 100 * rem);
}
return word;
}
public static String english_number(decimal val) {
if (val < 100) {
return convert_nn(val);
}
if (val < 1000) {
return convert_nnn(val);
}
for (integer v = 0; v < denom.size(); v++) {
integer didx = v - 1;
integer dval = (integer)Math.pow(1000, v);
if (dval > val) {
integer mod = (integer)Math.pow(1000, didx);
integer l = (integer) val / mod;
decimal r = val - (l * mod);
String ret = convert_nnn(l) + ' ' + denom[didx];
if (r > 0) {
ret += ' ' + english_number(r);
}
return ret;
}
}
return 'Should never get here, bottomed out in english_number';
}
}