17 messaggi dal 11 novembre 2014
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
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
ascolta, dovresti abbandonare questa classe. Anche risolvendo il problema, non c'è modo di sapere in quali altri casi smetterà di funzionare.

adachigahara ha scritto:

non riesco a capire perche'

E' normale, è difficile riuscirci.Ti sta facendo perdere tempo e ti metterà nei guai, specie se ti serve per rappresentare dati finanziari.

Se hai una scadenza da rispettare, ti consiglio di usare questa qui già pronta.
http://community.visual-basic.it/lucianob/archive/2006/05/02/17132.aspx

Altrimenti, sarebbe un'ottima esperienza formativa quella di riscrivere la classe da capo usando un altro approccio, il test driven development.
Guarda questo video di Piergiuliano Bossi, che mostra un esempio molto simile al tuo (conversione a numero romano).
https://www.youtube.com/watch?v=ADO7zcNXSIY

Sorvola sul fatto che stia usando Eclipse e Java, l'importante è afferrare il procedimento, che è lo stesso anche su Visual Studio con C#.
Lo scopo è fare piccoli, semplici passi, che in breve tempo ti portano ad una soluzione solida e il cui funzionamento è comprovato dai tests.

Altri consigli:
  • La tua classe dovrebbe accettare un parametro decimal, non stringa.
  • Deve essere proprio decimal, non double. Il double è approssimato e ti conduce a situazioni all'apparenza incomprensibili come questa.


ciao,
Moreno
Modificato da BrightSoul il 04 dicembre 2014 00.19 -

Enjoy learning and just keep making
17 messaggi dal 11 novembre 2014
ciao.. intanto ti ringrazio molto per la tua risposta.. ho passato il valore decimal alla classe come da te suggerito, ma non risolvo nulla lo stesso, in pratica dopo la virgola mi mette / e se ci sono 4 numeri mi mette gli ultimi due , mentre se c'e' un solo numero mi mette in modo corretto /80 , e se ci sono solo 2 numeri dopo la virgola mi mette anche qui in modo corretto /22.
Quindi il mio problema e' solo quando ci sono 4 o piu' numeri dopo la virgola e non capisco perche mi legge solo le ultime due cifre e non le prime due o tutti i numeri.

Spero di essermi spiegato, per es. ho 2234,2345 lui mi mette /45
decimale_stringa = numero_in.Substring(numero_in.Length - 2,2);

tu qui consideri sempre 2 cifre decimali.. o sbaglio? :)

Ormai programmano tutti... ma la professionalità appartiene a pochi
17 messaggi dal 11 novembre 2014
si... ma ho provato a cambiare i numeri.. ma nulla.. tu come faresti?
ho provato ma nulla.. come hai cambiato?

questa funzione come ti hanno scritto è troppo complessa e pertanto non manutenibile. Se un domani qualcun altro dovrà aprire quel codice ti fischieranno le orecchie :D

Cmq prenderei la stringa e farei uno split sul separatore decimale avendo una parte intera e una decimale.

Ormai programmano tutti... ma la professionalità appartiene a pochi
17 messaggi dal 11 novembre 2014
se puoi e non ti crea problemi potresti scrivermi cosa faresti?
17 messaggi dal 11 novembre 2014
decimale_stringa = numero_in.Substring(numero_in.Length - 2,2);

il problema sta qui... come faccio a fargli capire che deve prendere tutte le cifre dopo la virgola o solo quelle che interessano a me??... ho provato a cambiare i numeri "- 2, 2 " ma niente... spero che mi possiate aiutare

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.