Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Revoluțiile anilor '50-'6...

Provocarea saptamanii – Out...

Recomandari salon

Lipsa sunet din tv LG catre recei...
 Boxe 5.1 pentru PC.

Intreruperi placa grafica

Unde depun plangere?

Problema player Exodus
 upgrade placa video

Software liber

Programe pentru calcule electrote...

Servicii de live video broadcasting
 Schimbare key RCS

Ilan Laufer se leaga de ambasador...

S7 vs A5

Comptatiblitate CPU placa de baza...
 
Forumul Softpedia folosește "cookies" pentru a oferi utilizatorilor o experiență completă. Vezi detalii sau închide mesaj (x)

Transformare numere in litere C#

- - - - -
  • Please log in to reply
13 replies to this topic

#1
slusaralex

slusaralex

    Junior

  • Grup: Members
  • Posts: 16
  • Înscris: 05.11.2013
  • ID membru: 832,440
  • Locație: Suceava
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..Posted Image Thanks!

#2
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 14,127
  • Înscris: 24.02.2006
  • ID membru: 67,317
  • Locație: Bucuresti
algoritmul nu depinde de limbajul in care e implementat.

#3
nycolae

nycolae

    Active Member

  • Grup: Members
  • Posts: 1,951
  • Înscris: 29.03.2012
  • ID membru: 753,016
aşa ceva?
http://www.easysurf.cc/cnvert18.htm

#4
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 32,118
  • Înscris: 30.07.2003
  • ID membru: 5,142
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
slusaralex

slusaralex

    Junior

  • Grup: Members
  • Posts: 16
  • Înscris: 05.11.2013
  • ID membru: 832,440
  • Locație: Suceava

View Postnycolae, on 29 aprilie 2015 - 18:55, said:

Da

#6
MooF2010

MooF2010

    Active Member

  • Grup: Senior Members
  • Posts: 4,315
  • Înscris: 24.05.2010
  • ID membru: 592,808
  • Locație: Galati
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
slusaralex

slusaralex

    Junior

  • Grup: Members
  • Posts: 16
  • Înscris: 05.11.2013
  • ID membru: 832,440
  • Locație: Suceava
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 Posted Image

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
MarianG

MarianG

    Guru Member

  • Grup: Moderators
  • Posts: 17,222
  • Înscris: 10.08.2005
  • ID membru: 43,530
  • Locație: Iasi
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
rusoaica

rusoaica

    Junior

  • Grup: Members
  • Posts: 2
  • Înscris: 03.05.2009
  • ID membru: 453,618
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
IvanMihai

IvanMihai

    Junior

  • Grup: Members
  • Posts: 104
  • Înscris: 08.02.2016
  • ID membru: 944,402
  • Locație: Timisoara
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
rusoaica

rusoaica

    Junior

  • Grup: Members
  • Posts: 2
  • Înscris: 03.05.2009
  • ID membru: 453,618
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
IvanMihai

IvanMihai

    Junior

  • Grup: Members
  • Posts: 104
  • Înscris: 08.02.2016
  • ID membru: 944,402
  • Locație: Timisoara
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
dani.user

dani.user

    Guru Member

  • Grup: Moderators
  • Posts: 22,633
  • Înscris: 24.02.2007
  • ID membru: 146,987
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
dani.user

dani.user

    Guru Member

  • Grup: Moderators
  • Posts: 22,633
  • Înscris: 24.02.2007
  • ID membru: 146,987
Atat de usor devine si cu mult mai putin cod daca divizam munca:

  • Spargem valoarea in grupe de cate 3 cifre (mii, milioane, miliarde, etc)
  • Procesam cat mai usor fiecare grup de cate 3 cifre (aici cel mai mult incurca 'si'-ul pentru unitati)
  • Tratam ulterior particularitiile limbii romane, inlocuind diverse exceptii

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