Conversione dopo la virgola errata

venerdì 28 novembre 2014 - 19.02
Tag Elenco Tags  C#  |  .NET 4.0  |  Visual Studio 2010  |  Oracle 9g

adachigahara Profilo | Newbie

salve a tutti.. spero che mi possiade dare una mano.. ho questo codice :

public class diconsi
{
// DICONSI EURO
public String Diconsi(String numero_in)
{
String decimale_stringa = "";

if (numero_in.Length > 2)
{
decimale_stringa = numero_in.Substring(numero_in.Length - 2,2);
numero_in = numero_in.Replace('.', ',');
double numero = (Convert.ToDouble(numero_in)) / 100;
int intero = (int)numero;
String test = NumberToText(intero);
return test + "/" + decimale_stringa;
}
else
{
if (numero_in.Length > 1)
{
return "zero/" + numero_in;
}
if (numero_in.Length == 1)
{
return "zero/0" + numero_in;
}

}
return "";

}

// CONVERSIONE DA NUMERO A TESTO
public String NumberToText(int n)
{
if (n < 0)
{
return "meno" + NumberToText(-n);
}
else if (n == 0)
{
return "";
}
else if (n <= 19)
{
return new String[]{"uno", "due", "tre", "quattro", "cinque",
"sei", "sette", "otto", "nove", "dieci", "undici",
"dodici", "tredici", "quattordici", "quindici", "sedici",
"diciasette", "diciotto", "diciannove"}[n - 1] + "";
}
else if (n <= 99)
{
String num_successivo = NumberToText(n % 10);
if (num_successivo.Equals(""))
{
return new String[]{"venti", "trenta", "quaranta",
"cinquanta", "sessanta", "settanta", "ottanta",
"novanta"}[n / 10 - 2] + "" + num_successivo;
}
char c = Convert.ToChar(num_successivo.Substring(0, 1));

if (vocale(c))
{
return new String[]{"vent", "trent", "quarant", "cinquant",
"sessant", "settant", "ottant", "novant"}[n / 10 - 2] + "" + num_successivo;
}
else
{
return new String[]{"venti", "trenta", "quaranta",
"cinquanta", "sessanta", "settanta", "ottanta",
"novanta"}[n / 10 - 2] + "" + num_successivo;
}
}
else if (n <= 199)
{
return "cento" + NumberToText(n % 100);
}
else if (n <= 999)
{
return NumberToText(n / 100) + "cento" + NumberToText(n % 100);
}
else if (n <= 1999)
{
return "mille" + NumberToText(n % 1000);
}
else if (n <= 999999)
{
return NumberToText(n / 1000) + "mila" + NumberToText(n % 1000);
}
else if (n <= 1999999)
{
return "unmilione" + NumberToText(n % 1000000);
}
else if (n <= 999999999)
{
return NumberToText(n / 1000000) + "milioni" + NumberToText(n % 1000000);
}
else if (n <= 1999999999)
{
return "unmiliardo" + NumberToText(n % 1000000000);
}
else
{
return NumberToText(n / 1000000000) + "miliardi" + NumberToText(n % 1000000000);
}

}

private bool vocale(char c)
{
if ((c == 'a') || (c == 'e') || (c == 'i') || (c == 'o') || (c == 'u'))
{
return true;
}

return false;

}

non riesco a capire perche' quando ci sono due cifre dopo la virgola mi converte la cifra errata, cioe' per spiegarmi ho 243,24 me lo converte in duecentoquarantatre/,4 .
Mentre quando ho 133,1224 me lo converte in centotrentatre/24.
Spero che mi possiade dare una mano.. vi ringrazio anticipatamente

pieroalampi Profilo | Expert

hai provato
numero_in = numero_in.Replace('.', ',');
ad invertirlo?
numero_in = numero_in.Replace(',', '.');
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

adachigahara Profilo | Newbie

prima era "," "." e non andava bene cioe' non mi faceva la conversione in modo corretta , poi l 'ho passata in "." "," e la conversione la fa bene tranne che per le cifre dopo la virgola, cioe' se ci sono 4 cifre dopo la virgola allora mi mette le ultime 2 , se invece ci sono solo 2 cifre dopo la virgola mi spunta /, e il secondo numero.


in cosa sbaglio?

adachigahara Profilo | Newbie

nessuno mi sa aiutare?

0v3rCl0ck Profilo | Guru

e se ti dicessi che c'è una libreria che fa già tutto questo

si chiama Humanizer ed è open-source su GitHub: http://github.com/MehdiK/Humanizer

e il tuo esempio diventerebbe così:

void Main() { var d = 243.24m; var i = (int)d; var r = (int)((d - Math.Truncate(d)) * 100); var s = string.Format("{0}/{1}", ((int)d).ToWords(CultureInfo.GetCultureInfo("it-IT")), r); Console.WriteLine(s); }

Risultato: duecentoquarantatré/24


Michael Denny | Microsoft Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.net
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

adachigahara Profilo | Newbie

grazie della risposta... quindi dici di integrare quello che mi hai scritto nella mia classe? se si .. tu dove lo inseriresti? un altra cosa... facendo cosi come mi dici tu
213,7654 me lo converte in duecentotredici/7654 o duecentotredici/76 ?

0v3rCl0ck Profilo | Guru

>grazie della risposta... quindi dici di integrare quello che
>mi hai scritto nella mia classe? se si .. tu dove lo inseriresti?

Si, installi/importi il riferimento con NuGet che è il metodo più veloce, e metti le due righe di codice nella funzione che prima ti ritornava la stringa dato il numero, credo "Diconsi(String numero_in)", che a quel punto mi farei passare direttamente il decimal, invece che la string, se ce l'hai a disposizione.

>un altra cosa... facendo cosi come mi dici tu
>213,7654 me lo converte in duecentotredici/7654 o duecentotredici/76
>?

lo converte in "duecentotredici/76". ma puoi tranquillamente avere anche "duecentotredici/7654" se vuoi, li sta a te modificare la parte di estrazione della parte decimale "var r = (int)((d - Math.Truncate(d)) * 100);", io l'ho fatto con una funzione matematica, ma puoi fare anche l'estrazione con manipolazione su stringa, regular expression, ecc... oppure puoi lasciare la funzione matematica e prima di moltiplicare per 100, fare un Math.Round, per arrotondare a 2 decimali, quello sta a te, non dipende dalla libreria Humanizer.


Michael Denny | Microsoft Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.net
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

adachigahara Profilo | Newbie

public String Diconsi(String numero_in)
{
String decimale_stringa = "";

if (numero_in.Length > 2)
{
decimale_stringa = numero_in.Substring(numero_in.Length -2,2);
numero_in = numero_in.Replace('.' , ',');
Decimal numero = (Convert.ToDecimal(numero_in)) / 100;


int intero = (int)numero;

String test = NumberToText(intero);
return test + "/" + decimale_stringa;


ho messo al posto del double Decimal... e' sbagliato cosi'? devo modificare qualcosa ? o devo aggiungere qualcosa?
il "var r = (int)((d - Math.Truncate(d)) * 100);" dove lo inserisco?

0v3rCl0ck Profilo | Guru

intanto voglio suggerirti di racchiudere il codice tra tag [ code]...codice...[/ code] (senza spazi nelle quadre) perchè altrimenti si fa fatica a leggere bene il codice.

> ho messo al posto del double Decimal... e' sbagliato cosi'?

se sono importi monetari, è sempre meglio utilizzare il decimal, il double è ideato per numeri reali, come misurazioni di vario genere naturale (peso, distanza, ecc..), oppure nella statistica matematica in genere.

> devo modificare qualcosa ? o devo aggiungere qualcosa?

devi togliere tutta la vecchia logica di conversione da numero a testo, e metterci la chiamata allo Humanizer, aggiungendo l'accoppiata "var r = (int)((d - Math.Truncate(d)) * 100);" e "var s = string.Format("{0}/{1}", ((int)d).ToWords(CultureInfo.GetCultureInfo("it-IT")), r);", nella variabile "r" è semplicemente contenuto la parte decimale.


Michael Denny | Microsoft Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.net
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

adachigahara Profilo | Newbie

quindi da //conversione numero a testo e' tutto errato... o meglio non funziona a dovere da quello che ho capito... quindi al posto di questo metto la chiamata alla libreria da te citata (credo che trovo tutto nel file scaricato no? oppure e' ancora piu' semplice la chiamata?) e infine aggiungere "var r = (int)((d - Math.Truncate(d)) * 100);" e "var s = string.Format("{0}/{1}", ((int)d).ToWords(CultureInfo.GetCultureInfo("it-IT")), r);" giusto?

ps. lo so che ti sto facendo uscire pazzo :(

0v3rCl0ck Profilo | Guru

>quindi da //conversione numero a testo e' tutto errato... o meglio
>non funziona a dovere da quello che ho capito... quindi al posto
>di questo metto la chiamata alla libreria da te citata

metti le due istruzioni, una per avere la parte decimale da aggiungere dopo la / e lo string.format con dentro il ToWords(..)

>(credo che trovo tutto nel file scaricato no? oppure e' ancora piu'
>semplice la chiamata?)

di che file stai parlando? della dll Humanizer scaricata da GitHub?

>ps. lo so che ti sto facendo uscire pazzo :(

un po'



Michael Denny | Microsoft Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.net
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

adachigahara Profilo | Newbie

ti giuro che pure io sto uscendo pazzo con questa classe :(

si intendo il file scaricato da li... ma so che ti chiedero' troppo ma non e che mi puoi scrivere tutte le istruzioni?

0v3rCl0ck Profilo | Guru

che non succeda più!!

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


questo è il risultato:

uno/0
uno/9
uno/90
uno/99
dodici/99
centoventitré/99
milleduecentotrentaquattro/99
dodicimilatrecentoquarantacinque/99
centoventitremilaquattrocentocinquantasei/99
un milione duecentotrentaquattromilacinquecentosessantasette/99
dodici milioni trecentoquarantacinquemilaseicentosettantotto/99
centoventitré milioni quattrocentocinquantaseimilasettecentoottantanove/99
un miliardo duecentotrentaquattro milioni cinquecentosessantasettemilaottocentonovanta/99



Michael Denny | Microsoft Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.net
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

adachigahara Profilo | Newbie

grazie mille sei stato gentilissimo e molto paziente ... sei un grande!!

0v3rCl0ck Profilo | Guru

>grazie mille sei stato gentilissimo e molto paziente ... sei
>un grande!!



accetta un post, così si chiude il thread


Michael Denny | Microsoft Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.net
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5