Перевтілення StrSum: Java

StrSum версія Java

package org;

/**
 * @Створено 2011.11.02
 * @назва StrSum
 * @author vw
 *
 * застосування: System.out.println("*" + new StrSum(123.45).getStrSum() + "*");
 *
 */
public class StrSum {
  Double nsum = 0.0;

  String akop[] = {"","коп.","коп.","коп."};
  // String akop[] = {"","копійка","копійки","копійок"};
  String agrn[][] = {
    {"грн.","","","","t"},
    {"тисяч","а","i","","t"},
    {"мiльйон","","и","iв","f"},
    {"мiльярд","","и","iв","f"},
    {"трильйон","","и","iв","f"}
    // масив можна доповнити http://users.skynet.be/nizgorur/very_big_numbers.htm
  };
  //
  String adigits[][] = {
    {"","один","два","три","чотири","п'ять","шiсть","сiм","вiсiм","дев'ять",
     "десять","оди","два","три","чотир","п'ят","шiст","сiм","вiсiм","дев'ят"},
    {"двадцять","тридцять","сорок","п'ятдесят","шiстдесят","сiмдесят","вiсiмдесят","дев'яносто"},
    {"","сто","двiстi","триста","чотириста","п'ятсот","шiстсот","сiмсот","вiсiмсот","дев'ятсот"}};
  String adigitst[] = {"","одна","двi"};
  String Over10 = "надцять";
  String csum = "";

  public StrSum(Double sum) {
    //
    nsum = Math.abs(sum);
    // String ssgn = (sum < 0) ? "Мінус " : "";
    String ssum = String.valueOf(nsum).trim(); // "#################0.00"
    String nkop = ssum.substring(ssum.indexOf(".")+1); // видiляю копiйки
    String sgrn = ssum.substring(0, ssum.indexOf(".")); // видiляю гривнi
    // System.out.println(nsum);
    // System.out.println("грн.       - " + sgrn);
    // System.out.println("коп.       - " + nkop);
    // System.out.println("довжина    - " + sgrn.length());
    //
    // визначаю кiлькiсть трiад
    int ntriads = (int) Math.ceil(((double) sgrn.length())/3); // Math.round(sgrn.length()/3);
    // System.out.println("тріад      - " + ntriads);
    //
    if (Integer.valueOf(sgrn)!=0) { // є гривні?
      String s = "";
      // додати пробіли неповній т.
      for (int i=0; i<(ntriads*3 - sgrn.length()); i++) s = s + " ";
      sgrn = s + sgrn;
     // System.out.println(sgrn);
      if (ntriads <= agrn.length) {
        // Debug.Print UBound(agrn)
        String st = "";
        for (int ntriad = 0; ntriad < ntriads; ntriad++) {
          // видiляю трiаду
          int p = ntriad*3;
          st = sgrn.substring(p, p+3);
          //System.out.println("-" + st + "-");
          int r = ntriads-ntriad-1;
         // System.out.println("r: " + r + " -" + st + "-");
         // System.out.println("agrn: " + agrn[r][0]);
         // System.out.println("----: " + agrn[r][ind(Integer.valueOf(st.substring(1).trim()))]);
          csum += ("000".equals(st) ? "" : strtriad(st, agrn[r][4])) + " " +
                  agrn[r][0] + agrn[r][ind(Integer.valueOf(st.substring(1).trim()))] + " ";
        }
        // дописати назву грошової одиниці коли остання тріада '000'
        csum += ("000".equals(st) ? agrn[ntriads + 1][1] + agrn[ntriads + 1][ind(Integer.valueOf(st))] + " " : "");
        // дописати копійки
        csum += nkop + " " + akop[ind(Integer.valueOf(nkop))];
      }
    } else { csum = "дуже багато гривень"; }
    // csum = sgrn + "-" + nkop;    
  }

  public String getStrSum() {
    return csum;
  }

  private String strtriad(String st, String ltriad) {
    //     st: тріада
    // ltriad: .f. тріада чоловічого роду, .t. тріада жіночого роду
    // return: тріада словами

    int digit, t;
    String c = "";
    t = Integer.valueOf(st.trim());
    // Debug.Print "stt st,t,c  —"; st, t, c
    if (t > 99) {
       digit = (int) t / 100;
       c = adigits[2][digit] + " "; // [3][digit + 1]
       t = t % 100; // t%
    }
    // Debug.Print "stt t,c  —"; t, c
    if (t > 19) {
       digit = (int) t / 10;
       c = c + adigits[1][digit - 2] + " "; // [2][digit - 1]
       t = t % 10; //            ' t%
    }
    // Debug.Print "stt t,c  —"; t, c
    if ("t".equals(ltriad) & t < 3) {      // трiада ж. роду
       c = c + adigitst[t];
    } else {
       c = c + adigits[0][t] + (t > 10 ? Over10 : "");
    }
    // Debug.Print "==", t, c
    return c;
  }

  private int ind(int n) {
    //  in: n - число                 // n - цiле число<20
    // out: iндекс закiнчення
    int i = n < 20 ? n : (n % 10);
    int x = i == 1 ? 1 : ((i >= 2) & (i <= 4)) ? 2 : 3;
    return x;
  }
}

=-=-=-=-=
Powered by Blogilo

Advertisements

One Response to Перевтілення StrSum: Java

  1. Пінгбек: Кілька перевтілень StrSum() « Java це просто

Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: