Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
Transformare numere in litere C#
Last Updated: Dec 09 2017 11:37, Started by
slusaralex
, Apr 29 2015 18:42
·
0
#1
Posted 29 April 2015 - 18:42
Salut ! As vrea sa stiu daca are cineva sau daca stie cineva un algoritm de transformare a numerelor in litere adica 232-> douăsute treizecișidoi , care sa fie scris in C#. Eu am dat un search ,dar tot ce am gasit este scris in VB sau PHP.. Thanks!
|
#2
Posted 29 April 2015 - 18:53
algoritmul nu depinde de limbajul in care e implementat.
|
#4
Posted 29 April 2015 - 18:55
Pai un astfel de algoritm chiar tu ar trebui sa poti concepe ! Daca te uiti atent la reprezentarea textului ai sa vezi ca-s cateva sabloane ce le implementezi ca atare iar restul e dinamic si direct din ordinul zecilor, sutelor, miilor etc.
Edited by neagu_laurentiu, 29 April 2015 - 18:56. |
#5
Posted 29 April 2015 - 19:07
#6
Posted 29 April 2015 - 19:37
spargi numarul il citesti de la stanga la dreapta si incepi: pentru numarul abcde ai amzeci daca b e zero ramai asa daca nu completezi cu si b + mii + c sute + dzeci daca e e zero ramane asa daca nu pui si e.....
nu vad asa greu algoritmul. |
#7
Posted 30 April 2015 - 16:29
Pana la urma am facut eu un astfel de algoritm , nu arata chiar asa profi ,dar isi face treaba. Il las aici pentru cei care o sa aiba nevoie de el
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace conversie { class Conversie { private int[] cifre; public string Prep_number(float number) { if (number == 0) return "zero"; else if (number < 10000000) { string[] nrs = number.ToString().Split('.'); string result = ""; int trunc = Int32.Parse(nrs[0]); int n; if (nrs.Length > 1 && Int32.TryParse(nrs[1], out n)) { int dec = Int32.Parse(nrs[1]); result +=Con(trunc); result += " si "; switch(dec) { case 1: result += "zece Bani"; break; case 0: result += "zero Bani"; break; case 2: result += "douazeci Bani"; break; case 3: result += "treizeci Bani"; break; case 4: result += "patruzeci Bani"; break; case 5: result += "cincizeci Bani"; break; case 6: result += "saizeci Bani"; break; case 7: result += "saptezeci Bani"; break; case 8: result += "optzeci Bani"; break; case 9: result += "nouazeci Bani"; break; default: { if (dec > 100) dec = dec / 10; for (int i = 0; i < 7; i++) cifre[i] = 0; int dec_r = dec; int index = 0; while (dec_r != 0) { cifre[index] = dec_r % 10; dec_r = dec_r / 10; index++; } result += Creare_grupa(0,2)+" Bani"; break; } } } else result = Con(trunc); return result; } else return "Numar prea mare"; } public string Con(int number) { string rezultat=""; cifre = new int[9]; for (int i = 0; i < 8; i++) cifre[i] = 0; int nrp = number; int index = 0; while(nrp!=0) { cifre[index] = nrp % 10; nrp = nrp / 10; index++; } switch ((cifre[7]*10)+cifre[6]) { case 1: rezultat = rezultat = " un milion "; break; case 2: rezultat = rezultat = " doua milioane "; break; case 3: rezultat = rezultat = " trei milioane "; break; case 4: rezultat = rezultat = " patru milioane "; break; case 5: rezultat = rezultat = " cinci milioane "; break; case 6: rezultat = rezultat = " sase milioane "; break; case 7: rezultat = rezultat = " sapte milioane "; break; case 8: rezultat = rezultat = " opt milioane "; break; case 9: rezultat = rezultat = " noua milioane "; break; } switch ((((cifre[5] * 10) + cifre[4]) * 10) + cifre[3]) { case 1: rezultat += " o mie "; break; case 2: rezultat += " doua mii "; break; case 3: rezultat += " trei mii"; break; case 4: rezultat += " patru mii"; break; case 5: rezultat += " cinci mii"; break; case 6: rezultat += " sase mii"; break; case 7: rezultat += " sapte mii"; break; case 8: rezultat += " opt mii"; break; case 9: rezultat += " noua mii"; break; default : { if (((cifre[4] * 10) + cifre[3]) > 0) { if (((cifre[4] * 10) + cifre[3]) > 20) { rezultat += Creare_grupa(3, 5) + " de mii "; } else { rezultat += Creare_grupa(3, 5) + " mii "; } } break; } } switch ((((cifre[2] * 10) + cifre[1]) * 10) + cifre[0]) { case 1: rezultat += " unu "; break; case 2: rezultat += " doi "; break; case 3: rezultat += " trei "; break; case 4: rezultat += " patru "; break; case 5: rezultat += " cinci "; break; case 6: rezultat += " sase "; break; case 7: rezultat += " sapte "; break; case 8: rezultat += " opt "; break; case 9: rezultat += " noua "; break; } rezultat += Creare_grupa(0,2) + " Lei "; return rezultat; } private string Creare_grupa(int start,int end) { string[] cifre_lit = new string[] { "o", "doua", "trei", "patru", "cinci", "sase", "sapte", "opt", "noua" }; string[] cifre_lit2 = new string[] {"zece", "unsprezece", "doisprezece", "treisprezece", "paisprezece", "cincisprezece", "saisprezece", "saptesprezece", "optusprezece", "nouasprezece" }; string[] cifre_lit3 = new string[] { "douazeci", "treizeci", "patruzeci", "cincizeci", "saizeci", "saptezeci", "optzeci", "nouazeci", }; string[] cifre_lit4 = new string[] { "unu", "doi", "trei", "patru", "cinci", "sase", "sapte", "opt", "noua" }; string grupa_string=""; if (cifre[end] != 0) { grupa_string = cifre_lit[cifre[end] - 1]; if (cifre[end] == 1) grupa_string += " suta "; else grupa_string += " sute "; } end--; if (cifre[end] != 0) { if ((cifre[end] * 10) + cifre[end - 1] > 9 && (cifre[end] * 10) + cifre[end - 1]<20) { grupa_string += cifre_lit2[((cifre[end] * 10) + cifre[end - 1]) - 10]; } else { grupa_string += cifre_lit3[cifre[end] - 2]; if (cifre[end - 1] != 0) grupa_string += " si "; if (cifre[end-1] != 0) { grupa_string += cifre_lit4[cifre[end-1] - 1]; } } } return grupa_string; } } } |
#8
Posted 30 April 2015 - 19:01
dani.user parca postase un algoritm profi
modelul de baza x sute y zeci si z unitati unde unitati pot fi mii, milioane, etc Edited by MarianG, 30 April 2015 - 19:02. |
#9
Posted 30 November 2017 - 00:24
Scuze pentru reinvierea unui thread inactiv de ani de zile, dar poate cineva mai intalneste problema asta.
Alex, am testat codul tau, e ok in marea majoritate, dar sunt cazuri unde esueaza. Spre exemplu, 103,08. Afiseaza doar osutaleisiopzecisibani. Incorect atat ca numar, cat si zecimala. Am refacut bucata de cod, functioneaza acum pentru toate cazurile. Enjoy! private static int[] cifre; public static string Prep_number(decimal number) { if (number == 0) return "zeroleisizerobani"; else if (number < 10000000) { string[] nrs = Methods._current_culture_separator == "." ? number.ToString().Split('.') : number.ToString().Split(','); string result = ""; int trunc = Int32.Parse(nrs[0]); int n; if (nrs.Length > 1 && Int32.TryParse(nrs[1], out n)) { int dec = Int32.Parse(nrs[1]); result += Con(trunc); result += "si"; switch (dec) { case 1: result += "unubani"; break; case 0: result += "zerobani"; break; case 2: result += "doibani"; break; case 3: result += "treibani"; break; case 4: result += "patrubani"; break; case 5: result += "cincibani"; break; case 6: result += "sasebani"; break; case 7: result += "saptebani"; break; case 8: result += "optbani"; break; case 9: result += "nouabani"; break; default: { if (dec > 100) dec = dec / 10; for (int i = 0; i < 7; i++) cifre[i] = 0; int dec_r = dec; int index = 0; while (dec_r != 0) { cifre[index] = dec_r % 10; dec_r = dec_r / 10; index++; } result += Creare_grupa(0, 2) + "bani"; break; } } } else result = Con(trunc); return result; } else return "Numar prea mare"; } public static string Con(int number) { string rezultat = ""; cifre = new int[9]; for (int i = 0; i < 8; i++) cifre[i] = 0; int nrp = number; int index = 0; while (nrp != 0) { cifre[index] = nrp % 10; nrp = nrp / 10; index++; } switch ((cifre[7] * 10) + cifre[6]) { case 1: rezultat = "unmilion"; break; case 2: rezultat = "douamilioane"; break; case 3: rezultat = "treimilioane"; break; case 4: rezultat = "patrumilioane"; break; case 5: rezultat = "cincimilioane"; break; case 6: rezultat = "sasemilioane"; break; case 7: rezultat = "saptemilioane"; break; case 8: rezultat = "optmilioane"; break; case 9: rezultat = "nouamilioane"; break; } switch ((((cifre[5] * 10) + cifre[4]) * 10) + cifre[3]) { case 1: rezultat += "omie"; break; case 2: rezultat += "douamii"; break; case 3: rezultat += "treimii"; break; case 4: rezultat += "patrumii"; break; case 5: rezultat += "cincimii"; break; case 6: rezultat += "sasemii"; break; case 7: rezultat += "saptemii"; break; case 8: rezultat += "optmii"; break; case 9: rezultat += "nouamii"; break; default: { if (((cifre[4] * 10) + cifre[3]) > 0) { if (((cifre[4] * 10) + cifre[3]) > 20) rezultat += Creare_grupa(3, 5) + "demii"; else rezultat += Creare_grupa(3, 5) + "mii"; } break; } } switch ((((cifre[2] * 10) + cifre[1]) * 10) + cifre[0]) { case 1: rezultat += "unu"; break; case 2: rezultat += "doi"; break; case 3: rezultat += "trei"; break; case 4: rezultat += "patru"; break; case 5: rezultat += "cinci"; break; case 6: rezultat += "sase"; break; case 7: rezultat += "sapte"; break; case 8: rezultat += "opt"; break; case 9: rezultat += "noua"; break; } rezultat += Creare_grupa(0, 2) + "lei"; return rezultat; } private static string Creare_grupa(int start, int end) { string[] cifre_lit = new string[] { "o", "doua", "trei", "patru", "cinci", "sase", "sapte", "opt", "noua" }; string[] cifre_lit2 = new string[] { "zece", "unsprezece", "doisprezece", "treisprezece", "paisprezece", "cincisprezece", "saisprezece", "saptesprezece", "optsprezece", "nouasprezece" }; string[] cifre_lit3 = new string[] { "douazeci", "treizeci", "patruzeci", "cincizeci", "saizeci", "saptezeci", "optzeci", "nouazeci", }; string[] cifre_lit4 = new string[] { "unu", "doi", "trei", "patru", "cinci", "sase", "sapte", "opt", "noua" }; string grupa_string = ""; if (cifre[end] != 0) { grupa_string = cifre_lit[cifre[end] - 1]; if (cifre[end] == 1) grupa_string += "suta"; else grupa_string += "sute"; } end--; if (cifre[end] != 0) { if ((cifre[end] * 10) + cifre[end - 1] > 9 && (cifre[end] * 10) + cifre[end - 1] < 20) grupa_string += cifre_lit2[((cifre[end] * 10) + cifre[end - 1]) - 10]; else { grupa_string += cifre_lit3[cifre[end] - 2]; if (cifre[end - 1] != 0) grupa_string += "si"; if (cifre[end - 1] != 0) grupa_string += cifre_lit4[cifre[end - 1] - 1]; } } else { if (cifre[end - 1] != 0 && cifre[2] != 0) grupa_string += cifre_lit4[cifre[end - 1] - 1]; } return grupa_string; } |
#10
Posted 30 November 2017 - 23:59
Propria me implementare aici:
/* * Created by SharpDevelop. * User: Mihai * Date: 11/30/2017 * Time: 2:41 PM * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using System.Globalization; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace conversie { class Conversie { public static int NumarDeCifre(int numar) { int NumarDeCifre = 0; int numar_lucru = numar; while (numar_lucru!=0) { numar_lucru /= 10; // impartim la zece NumarDeCifre++; } if (numar==0) NumarDeCifre++; // avem o exceptie: cand numarul este 0 avem o cifra return NumarDeCifre; } public static int RidicareLaPutere(int numar, int putere) { int calculat = 1; while (putere!=0) { calculat *= 10; // inmultim cu zece putere--; } return calculat; } public static int CifraDeLaPozitie(int numar, int pozitie) { pozitie--; int divizor = RidicareLaPutere(10, pozitie); return numar/divizor; // imparte pentru a obtine cifra de la pozitie } static string[] cifre_lit = new string[] { "o", "doua", "trei", "patru", "cinci", "sase", "sapte", "opt", "noua" }; public static string CifraLaLiteral(int cifra, int numar_de_cifre, bool EsteFeminin) { if (numar_de_cifre==2&&cifra==6) // exceptie 16 - saisprezece, 64 return "sai"; // sai nu sase switch (cifra) { case 1: if (EsteFeminin&&numar_de_cifre!=10) // miliarde este un miliard - masculin la singular return "o"; else return "un"; case 2: if (EsteFeminin) return "doua"; else return "doi"; default: if ((cifra>=0)&&((cifra-1)<cifre_lit.Length)) return cifre_lit[cifra-1]; else return ""; } } public static bool EstePlural(int cifra) { if (cifra>1) return true; else return false; } static string[] cifre_lit2 = new string[] {"zece", "unsprezece", "doisprezece", "treisprezece", "paisprezece", "cincisprezece", "saisprezece", "saptesprezece", "optusprezece", "nouasprezece" }; static string GetSprezece(int numar) { if ((numar>=10)&&((numar-10)<cifre_lit2.Length)) return cifre_lit2[numar-10]; else return ""; } public static string ConversieNumarIntreg(int numar) { if (numar==0) return "zero"; string construit = ""; int numar_de_cifre = NumarDeCifre(numar); while (numar_de_cifre!=0) { int numar_de_la_pozitie = CifraDeLaPozitie(numar, numar_de_cifre); if (numar_de_la_pozitie>0) // cifrele cu zero nu ne intereseaza { bool EsteFeminin = false; bool bool_EstePlural = EstePlural(numar_de_la_pozitie); switch (numar_de_cifre) { case 10: // miliarde case 9: // sute de milioane case 6: // sute de mii case 3: // sute EsteFeminin = true; construit += CifraLaLiteral(numar_de_la_pozitie,numar_de_cifre, EsteFeminin)+" "; if (numar_de_cifre==10) // miliarde { if (bool_EstePlural) construit += "miliarde "; else construit += "miliard "; } else if (numar_de_cifre==9||numar_de_cifre==6||numar_de_cifre==3) // sute de milioane || sute de milioane || sute { if (bool_EstePlural) construit += "sute "; else construit += "suta "; } break; case 8: // daca este 1 prima cifra: sprezece, altfel doua zeci de milioane case 5: // daca este 1 prima cifra: sprezece, altfel zeci de mii case 2: // daca este 1 prima cifra: sprezece, altfel zeci EsteFeminin = true; if (numar_de_la_pozitie==1) { // iau doua cifre acum int numar_de_cifre_vechi = numar_de_cifre; numar_de_cifre--; numar_de_la_pozitie = CifraDeLaPozitie(numar, numar_de_cifre); // int doua_numere_de_la_pozitie if (numar_de_la_pozitie>1) bool_EstePlural = true; construit += GetSprezece(numar_de_la_pozitie); if (numar_de_cifre_vechi==8) // (numar_de_cifre+1) deoarece am scazut 1 { if (bool_EstePlural) construit += " milioane"; else construit += " milion"; } else if (numar_de_cifre_vechi==5) { if (bool_EstePlural) construit += " mii"; else construit += " mie"; } else if (numar_de_cifre_vechi==2) // nu a mai ramas nimic { construit += " "; } } else { construit += CifraLaLiteral(numar_de_la_pozitie,numar_de_cifre, EsteFeminin)+" "; if (bool_EstePlural) construit += "zeci"; } construit += " "; break; case 7: // un numar singur urmat: "si numar de milioane" case 4: // si "numar" de mii case 1: // si "numar" EsteFeminin = false; if (bool_EstePlural) EsteFeminin = true; else if (numar_de_cifre==7) EsteFeminin = false; else if (numar_de_cifre==4) EsteFeminin = true; bool EraGol = false; if (construit.Length>0) construit += "si "; else EraGol = true; construit += CifraLaLiteral(numar_de_la_pozitie,numar_de_cifre, EsteFeminin); if (numar_de_cifre==7) { if (bool_EstePlural) { if (!EraGol) construit += " de"; construit += " milioane "; // plural = feminin } else { construit += " milion "; // singular = masculin } } else if (numar_de_cifre==4) // si "numar" de mii { if (bool_EstePlural) { if (!EraGol) construit += " de"; construit += " mii "; // plural = feminin } else { construit += " mie "; // singular = feminin } } else if (numar_de_cifre==1&&(!bool_EstePlural)) // si "numar" { construit += "u"; // un + u = unu } break; default: break; } } int ridicat = 1; if ((numar_de_cifre-1)>0) // verifica ca puterea sa fie mai mare ca zero ridicat = RidicareLaPutere(10, numar_de_cifre-1); int de_scazut = numar_de_la_pozitie*ridicat; // eliminam numarul care a fost deja printat numar = numar-de_scazut; numar_de_cifre--; } return construit; } public static void Main(string[] args) { string str = ConversieNumarIntreg((int)103); // (float)101.08 = o suta zece Lei si optzeci Bani Console.WriteLine("Hello World!"); // TODO: Implement Functionality Here Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } } |
|
#11
Posted 04 December 2017 - 13:29
Interesanta implementare, Mihai!
Nu am testat-o, dar presupun ca functioneaza corect. M-am amuzat un pic la "return "sai"; // sai nu sase", si mi-am reamintit cate cazuri particulare poate limba romana sa ofere ) Apropo. // (float)101.08 = o suta zece Lei si optzeci Bani este, de fapt, o suta unu lei si optzeci bani. Presupun ca e doar un typo. |
#12
Posted 07 December 2017 - 14:30
O noua implementare mai complexa si mai exacta:
/* * Created by SharpDevelop. * User: Mihai * Date: 11/30/2017 * Time: 2:41 PM * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using System.Globalization; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace conversie { class Conversie { public static int NumarDeCifre(int numar) { int NumarDeCifre = 0; int numar_lucru = numar; while (numar_lucru!=0) { numar_lucru /= 10; // impartim la zece NumarDeCifre++; } if (numar==0) NumarDeCifre++; // avem o exceptie: cand numarul este 0 avem o cifra return NumarDeCifre; } public static int RidicareLaPutere(int numar, int putere) { int calculat = 1; while (putere!=0) { calculat *= 10; // inmultim cu zece putere--; } return calculat; } public static int CifraDeLaPozitie(int numar, int pozitie) { pozitie--; int divizor = RidicareLaPutere(10, pozitie); return numar/divizor; // imparte pentru a obtine cifra de la pozitie } static string[] cifre_lit = new string[] { "o", "doua", "trei", "patru", "cinci", "sase", "sapte", "opt", "noua" }; static string[] cifre_lit2 = new string[] {"zece", "unsprezece", "doisprezece", "treisprezece", "paisprezece", "cincisprezece", "saisprezece", "saptesprezece", "optusprezece", "nouasprezece" }; public static string CifraLaLiteral(int cifra, int numar_de_cifre, bool EsteFeminin) { if (cifra==0) return "zero"; if ((cifra>=10)&&((cifra-10)<cifre_lit2.Length)) // numar din doua litere! return cifre_lit2[cifra-10]; if (cifra==6&&(numar_de_cifre==2||numar_de_cifre==5||numar_de_cifre==8)) // 64 - sai nu sase return "sai"; // sai nu sase switch (cifra) { case 1: if (EsteFeminin) // miliarde este un miliard - masculin la singular return "o"; else return "un"; case 2: if (EsteFeminin) return "doua"; else return "doi"; default: if ((cifra>=0)&&((cifra-1)<cifre_lit.Length)) return cifre_lit[cifra-1]; else return ""; } } public static string NumarDeCifreInDeCe(int numar_de_cifre, bool EsteFeminin, bool bool_EstePlural, bool EraGol) { if (numar_de_cifre==10) // miliarde { if (bool_EstePlural) return "miliarde "; else return "miliard "; } if (numar_de_cifre==9||numar_de_cifre==6||numar_de_cifre==3) // sute de milioane || sute de mii || sute { if (bool_EstePlural) return "sute "; else return "suta "; } if (numar_de_cifre==8||numar_de_cifre==7) { // if (!EraGol) construit += " de"; if (bool_EstePlural) return "milioane "; else return "milion "; } if (numar_de_cifre==5||numar_de_cifre==4) { // if (!EraGol) construit += " de"; if (bool_EstePlural) return "mii "; else return "mie "; } if (numar_de_cifre==2) // nu a mai ramas nimic return " "; if (numar_de_cifre==1&&(!bool_EstePlural)) // si "numar" { return "u"; // un + u = unu } return ""; } public static bool EstePlural(int cifra) { if (cifra>1) return true; else return false; } public static string Separator = ""; public static string ConversieNumarIntreg(int numar) { if (numar==0) return "zero"; bool SpecialAvemMilioane = false; bool SpecialAvemMii = false; string construit = ""; int numar_de_cifre = NumarDeCifre(numar); while (numar_de_cifre!=0) { int numar_de_la_pozitie = CifraDeLaPozitie(numar, numar_de_cifre); if (numar_de_la_pozitie>0||(SpecialAvemMilioane&&numar_de_cifre==7)||(SpecialAvemMii&&numar_de_cifre==4)) { // cifrele cu zero nu ne intereseaza bool EsteFeminin = false; bool bool_EstePlural = EstePlural(numar_de_la_pozitie); switch (numar_de_cifre) { case 10: // miliarde case 9: // sute de milioane case 6: // sute de mii case 3: // sute if (construit!="") construit += Separator; if (numar_de_cifre==9&&numar_de_la_pozitie>0) SpecialAvemMilioane = true; // avem miloane if (numar_de_cifre==6&&numar_de_la_pozitie>0) SpecialAvemMii = true; // avem mii if (numar_de_cifre==10) // miliard la singular este un EsteFeminin = false; else EsteFeminin = true; construit += CifraLaLiteral(numar_de_la_pozitie,numar_de_cifre, EsteFeminin)+" "; construit += NumarDeCifreInDeCe(numar_de_cifre, EsteFeminin, bool_EstePlural, false); break; case 8: // daca este 1 prima cifra: sprezece, altfel doua zeci de milioane case 5: // daca este 1 prima cifra: sprezece, altfel zeci de mii case 2: // daca este 1 prima cifra: sprezece, altfel zeci if (numar_de_cifre==8&&numar_de_la_pozitie>0) SpecialAvemMilioane = false; // nu avem milioane if (numar_de_cifre==5&&numar_de_la_pozitie>0) SpecialAvemMii = false; // nu avem mii EsteFeminin = true; if (numar_de_la_pozitie==1) { // iau doua cifre acum int numar_de_cifre_vechi = numar_de_cifre; numar_de_cifre--; numar_de_la_pozitie = CifraDeLaPozitie(numar, numar_de_cifre); // int doua_numere_de_la_pozitie if (numar_de_la_pozitie>1) bool_EstePlural = true; construit += CifraLaLiteral(numar_de_la_pozitie, numar_de_cifre, EsteFeminin)+" "; construit += NumarDeCifreInDeCe(numar_de_cifre_vechi, EsteFeminin, bool_EstePlural, false); } else { construit += CifraLaLiteral(numar_de_la_pozitie,numar_de_cifre, EsteFeminin)+" "; if (bool_EstePlural) construit += "zeci"; } construit += " "; break; case 7: // un numar singur urmat: "si numar de milioane" case 4: // si "numar" de mii if (numar_de_cifre==7&&SpecialAvemMilioane&&numar_de_la_pozitie==0) { construit += NumarDeCifreInDeCe(numar_de_cifre, EsteFeminin, true, false); SpecialAvemMilioane = false; break; } if (numar_de_cifre==4&&SpecialAvemMii&&numar_de_la_pozitie==0) { construit += NumarDeCifreInDeCe(numar_de_cifre, EsteFeminin, true, false); SpecialAvemMii = false; break; } EsteFeminin = false; if (bool_EstePlural) EsteFeminin = true; else if (numar_de_cifre==7) EsteFeminin = false; else if (numar_de_cifre==4) EsteFeminin = true; bool EraGol = construit==""; if (!EraGol) construit += "si "; construit += CifraLaLiteral(numar_de_la_pozitie,numar_de_cifre, EsteFeminin)+" "; construit += NumarDeCifreInDeCe(numar_de_cifre, EsteFeminin, bool_EstePlural, EraGol); break; case 1: // ultima cifra: if (construit!="") // daca nu era gol construit += "si "; construit += CifraLaLiteral(numar_de_la_pozitie,numar_de_cifre, EsteFeminin); construit += NumarDeCifreInDeCe(numar_de_cifre, EsteFeminin, bool_EstePlural, construit==""); construit += " "; break; default: break; } } int ridicat = 1; if ((numar_de_cifre-1)>0) // verifica ca puterea sa fie mai mare ca zero ridicat = RidicareLaPutere(10, numar_de_cifre-1); int de_scazut = numar_de_la_pozitie*ridicat; // eliminam numarul care a fost deja printat numar = numar-de_scazut; numar_de_cifre--; } return construit; } public static string SeparatorUnitati = "si"; public static string PrimaUnitate = "leu"; public static string PrimaUnitatePlural; public static string ADouaUnitate = "ban"; public static string ADouaUnitatePlural; public static bool AreBani = false; public static string ConversieNumarDouble(double numar) { int parteIntreaga = (int)numar; // int parteFractional = (int)((numar - parteIntreaga) * 100); int first2DecimalPlaces = (int)(((decimal)numar % 1) * 100); if (first2DecimalPlaces==0) AreBani = false; else AreBani = true; string convertit = ""; PrimaUnitatePlural = PrimaUnitate; if (PrimaUnitatePlural.EndsWith("u")) PrimaUnitatePlural = PrimaUnitatePlural.Substring(0, PrimaUnitatePlural.Length-1); PrimaUnitatePlural += "i"; ADouaUnitatePlural = ADouaUnitate+"i"; if (parteIntreaga<0) // dace e numar negativ { convertit += "minus "; parteIntreaga = -parteIntreaga; } convertit += ConversieNumarIntreg(parteIntreaga); if (parteIntreaga==1) convertit += PrimaUnitate+" "; else convertit += PrimaUnitatePlural+" "; convertit += SeparatorUnitati+" "+ConversieNumarIntreg(first2DecimalPlaces); if (first2DecimalPlaces==1) convertit += ADouaUnitate+" "; else convertit += ADouaUnitatePlural+" "; return convertit; } public static char SepatorZecimale = '.'; public static string ConversieNumarDouble(string numar_double) { string[] splited = numar_double.Split(SepatorZecimale); int parteIntreaga = 0; // ToInt32 can throw FormatException or OverflowException. try { parteIntreaga = Convert.ToInt32(splited[0]); } catch (FormatException e) { } // int parteFractional = (int)((numar - parteIntreaga) * 100); int first2DecimalPlaces = 0; if (splited.Length>0) { if (splited[1].Length<2) splited[1] += "0"; splited[1] = splited[1].Substring(0, 2); try { first2DecimalPlaces = Convert.ToInt32(splited[1]); } catch (FormatException e) { } } if (first2DecimalPlaces==0) AreBani = false; else AreBani = true; string convertit = ""; PrimaUnitatePlural = PrimaUnitate; if (PrimaUnitatePlural.EndsWith("u")) PrimaUnitatePlural = PrimaUnitatePlural.Substring(0, PrimaUnitatePlural.Length-1); PrimaUnitatePlural += "i"; ADouaUnitatePlural = ADouaUnitate+"i"; if (parteIntreaga<0) // dace e numar negativ { convertit += "minus "; parteIntreaga = -parteIntreaga; } convertit += ConversieNumarIntreg(parteIntreaga); if (parteIntreaga==1) convertit += PrimaUnitate+" "; else convertit += PrimaUnitatePlural+" "; convertit += SeparatorUnitati+" "+ConversieNumarIntreg(first2DecimalPlaces); if (first2DecimalPlaces==1) convertit += ADouaUnitate+" "; else convertit += ADouaUnitatePlural+" "; return convertit; } public static void Main(string[] args) { string str1 = ConversieNumarDouble("457357.08"); string str = ConversieNumarIntreg((int)11); // (float)101.08 = o suta si unu lei si 8 bani Console.WriteLine("Hello World!"); // TODO: Implement Functionality Here Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } } Da, pentru partea intreaga era o eroare de scriere (typo) nu o eroare in algoritm. Dar la partea fractionala 0.08 lei = 8 bani -- nu? Implementarea mea este mai usor de inteles (mai clara). Nu inteleg celelalte implementari care au fost postate aici. Am facut niste calcule si cred ca am avut dreptate la partea cu banii: 1 leu nou = 10.000 lei vechi 50 bani noi = 5.000 lei vechi 1 ban nou ........ ???? lei vechi X = (1*5000) / 50 = 100 lei vechi 1 ban = 100 lei vechi = 0.01 lei noi Edited by IvanMihai, 07 December 2017 - 14:31. |
#13
Posted 09 December 2017 - 09:55
Folositi decimal cand vreti un numar cu virgula dar cu precizie, double mai pierde pe ici pe colo.
Edited by dani.user, 09 December 2017 - 10:24. |
#14
Posted 09 December 2017 - 11:37
Atat de usor devine si cu mult mai putin cod daca divizam munca:
Spoiler
Edited by dani.user, 09 December 2017 - 12:03. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users