May 7, 2015

Сума прописом українською, c++

Сьогодні по роботі мені знадобилася c++ функція, що перетворює ціле число на суму прописом українською мовою, по типу 123 = сто двадцять три.
В гуглі є багато варіантів на VBA, а під c++ я не знайшов.
Переробив з VBA під Borland C++ Builder, можливо комусь ще знадобиться:


/* Usage: Num2Ukr(1981) = один тисячa дев'ятсот вісімдесят один
          Num2Ukr(1981,1) = один тисячa дев'ятсот вісімдесят одна */
AnsiString Num2Ukr(long int n,int female=0){
  AnsiString Nums0[] = {"", "одна ", "дві ", "три ", "чотири ", "п'ять ",
    "шість ", "сім ", "вісім ", "дев'ять "};
  AnsiString Nums1[] = {"", "один ", "два ", "три ", "чотири ", "п'ять ",
    "шість ", "сім ", "вісім ", "дев'ять "};
  AnsiString Nums2[] = {"", "десять ", "двадцять ", "тридцять ", "сорок ",
    "п'ятдесят ", "шістдесят ", "сімдесят ", "вісімдесят ", "дев'яносто "};
  AnsiString Nums3[] = {"", "сто ", "двісті ", "триста ", "чотириста ",
    "п'ятсот ", "шістсот ", "сімсот ", "вісімсот ", "дев'ятсот "};
  AnsiString Nums4[] = {"", "одна ", "дві ", "три ", "чотири ", "п'ять ",
    "шість ", "сім ", "вісім ", "дев'ять "};
  AnsiString Nums5[] = {"десять ", "одинадцять ", "дванадцять ", "тринадцять ",
    "чотирнадцять ", "п'ятнадцять ", "шістнадцять ", "сімнадцять ",
    "вісімнадцять ", "дев'ятнадцять "};
  if(n==0)
    return "нуль";
  AnsiString st1 = n;
  if(st1.Length()>10)
    return "дуже багато :)";
  AnsiString Result;
  int c[10];
  for(int a=9;a>=0;a--){
    c[a] = 0;
    if(st1.Length()>a){
      c[a] = st1.SubString(1,1).ToIntDef(0);
      st1 = st1.Delete(1,1);
    }
  }
  // 9
  if(c[9]>0){
    if(c[9]==1)
      Result = (AnsiString)Nums1[c[9]]+"мільярд ";
    if((c[9]>=2)&&(c[9]<=4))
      Result = (AnsiString)Nums1[c[9]]+"мільярди ";
    if(c[9]>=5)
      Result = (AnsiString)Nums1[c[9]]+"мільярдів ";
  }
  // 8
  if(c[8]>0){
    Result = (AnsiString)Result+Nums3[c[8]];
    if((c[7]==0)&&(c[6]==0))
      Result = (AnsiString)Result+"мільйонів ";
  }
  // 7
  if(c[7]>0){
    if(c[7]==1)
      Result = (AnsiString)Result+Nums5[c[6]]+"мільйонів ";
    if(c[7]>1){
      Result = (AnsiString)Result+Nums2[c[7]];
      if(c[6]==0)
        Result = (AnsiString)Result+"мільйонів ";
    }
  }
  // 6
  if((c[6]>0)&&(c[7]!=1)){
    if(c[6]==1)
      Result = (AnsiString)Result+Nums1[c[6]]+"мільйон ";
    if((c[6]>=2)&&(c[6]<=4))
      Result = (AnsiString)Result+Nums1[c[6]]+"мільйона ";
    if(c[6]>=5)
      Result = (AnsiString)Result+Nums1[c[6]]+"мільйонів ";
  }
  // 5
  if(c[5]>0){
    Result = (AnsiString)Result+Nums3[c[5]];
    if((c[4]==0)&&(c[3]==0))
      Result = (AnsiString)Result+"тисяч ";
  }
  // 4
  if(c[4]>0){
    if(c[4]==1)
      Result = (AnsiString)Result+Nums5[c[3]]+"тисяч ";
    if(c[4]>1){
      Result = (AnsiString)Result+Nums2[c[4]];
      if(c[3]==0)
        Result = (AnsiString)Result+"тисяч ";
    }
  }
  // 3
  if((c[3]>0)&&(c[4]!=1)){
    if(c[3]==1)
      Result = (AnsiString)Result+Nums1[c[3]]+"тисячa ";
    if((c[3]>=2)&&(c[3]<=4))
      Result = (AnsiString)Result+Nums1[c[3]]+"тисячі ";
    if(c[3]>=5)
      Result = (AnsiString)Result+Nums1[c[3]]+"тисяч ";
  }
  // 2
  if(c[2]>0){
    Result = (AnsiString)Result+Nums3[c[2]];
  }
  // 1
  if(c[1]>0){
    if(c[1]==1)
      Result = (AnsiString)Result+Nums5[c[0]];
    if(c[1]>1)
      Result = (AnsiString)Result+Nums2[c[1]];
  }
  // 0
  if((c[0]>0)&&(c[1]!=1)){
    if(female)
      Result = (AnsiString)Result+Nums0[c[0]];
    else
      Result = (AnsiString)Result+Nums1[c[0]];
  }
  return Result;
}

No comments: