2015年11月13日 星期五

將數字轉為英文組合

將數字轉為英文組合

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';
    }
}

沒有留言:

張貼留言