Calcolo numeri vb net

martedì 27 maggio 2014 - 16.01
Tag Elenco Tags  VB.NET

leviathan89 Profilo | Newbie

Salve, quando si tratta di numeri rischio di impazzire, spero in un vostro aiuto.
Vi spiego il programma:

Ho tre fasce di sanzioni:
1) fascia comprende numeri da 211 a 2108.00 con rate autorizzate massimo a 12
2) fascia comprende numeri da 2108.01 a 5270.00 con rate autorizzate massimo a 24
3 ) fascia comprende numeri da 5270.01 a 99999.99 con rate autorizzate massimo a 60

Il programma in questo caso deve farmi un controllo; se la sanzione inserita nella prima fascia, dividendola per 105 è superiore a 12 allora il programma deve scrivere 12, se è inferiore a 12 deve scrivere il risultato però arrotondando per difetto, ovvero se è 2,4 deve scrivere 2, se è 2,8 deve scrivere sempre 2. Stessa cosa vale per il resto, inserita una sanzione della seconda fascia se la divido per 105 è superiore a 24 deve scrivere il suo risultato sempre arrotondando per difetto.
Io quando ho di mezzo i numeri impazzisco, so che è una cavolata. Facendolo con una fascia sola riesco ma con le altre non riporta.
Vi ringrazio anticipamente.
Buona giornata

Davide1986 Profilo | Junior Member

Io non so se ho capito bene quello che ti serve ma ti ho buttato giù un po di codice però in C# ma lo puoi modificare facilmente in VB.NET utilizzando i tool che si trovano on-line esempio questo : http://www.developerfusion.com/tools/convert/csharp-to-vb


Venendo a noi io ho creato un oggetto e quindi una Classe di nome Sanzione dove contiene i valori di Massimo , Minimo , e Rata Massima..

public class Sanzione { private float MinimaSansione; private float MassimaSansione; private int MassimeRate; public Sanzione(float MinimaSansione, float MassimaSansione, int MassimeRate) { this.MinimaSansione = MinimaSansione; this.MassimaSansione = MassimaSansione; this.MassimeRate = MassimeRate; } public float getMassimaSansione() { return this.MassimaSansione; } public float getMinimaSansione() { return this.MinimaSansione; } public int getMassimeRate() { return this.MassimeRate; } public void setMassimaSansione(float newMassimaSansione) { this.MassimaSansione = newMassimaSansione; } public void setMinimaSansione(float newMinimaSansione) { this.MinimaSansione = newMinimaSansione; } public void setMassimeRate(int newMassimeRate) { this.MassimeRate = newMassimeRate; } //public override bool Equals(object o) //{ // // If parameter is null return false. // if (o == null) // { // return false; // } // Sanzione sansione = (Sanzione)o; // return ( // (this.getMinimaSansione() == sansione.getMinimaSansione()) && // (this.getMinimaSansione() == sansione.getMassimaSansione()) && // (this.getMassimeRate() == sansione.getMassimeRate() ) // ); //} }

Per facilità io ho creato una Mappa contenente come Key la fascia della sanzione e come Valore l'oggetto Sanzione che contiene i valori Massimo , Minimo e Rata Massima ...

Di seguito puoi vedere come viene riempito il Dizionario e poi come fare il calcolo :

//Come chiave è la fascia della sanzione - <key,value> -> <int , Sanzione> private Dictionary<int, Sanzione> DizzionarioFascia = new Dictionary<int, Sanzione>();

Come riempire il dizionario con i valori :

public void CaricaDatiDizionario(){ // Ho tre fasce di sanzioni: //1) fascia comprende numeri da 211 a 2108.00 con rate autorizzate massimo a 12 //2) fascia comprende numeri da 2108.01 a 5270.00 con rate autorizzate massimo a 24 //3 ) fascia comprende numeri da 5270.01 a 99999.99 con rate autorizzate massimo a 60 DizzionarioFascia.Add(1, new Sanzione(211F, 2108.00F, 12)); DizzionarioFascia.Add(2, new Sanzione(2108.01F, 5270.00F, 24)); DizzionarioFascia.Add(3, new Sanzione(5270.01F, 99999.99F, 60)); }

Ora vediamo come ricavare il valore della rata dato come parametro un importo di una sanzione che è di tipo float :

N.B. ritorna valore -1 quando non è presente nessuna fascia che corrisponde esempio se metto come importo di sanzione (< 211F) oppure se è( > 99999.99F)

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

Il codice è facilmente modificabile.

Bozza codice VB.NET

Codice Classe Sanzione in VB.NET

Public Class Sanzione Private MinimaSansione As Single Private MassimaSansione As Single Private MassimeRate As Integer Public Sub New(MinimaSansione As Single, MassimaSansione As Single, MassimeRate As Integer) Me.MinimaSansione = MinimaSansione Me.MassimaSansione = MassimaSansione Me.MassimeRate = MassimeRate End Sub Public Function getMassimaSansione() As Single Return Me.MassimaSansione End Function Public Function getMinimaSansione() As Single Return Me.MinimaSansione End Function Public Function getMassimeRate() As Integer Return Me.MassimeRate End Function Public Sub setMassimaSansione(newMassimaSansione As Single) Me.MassimaSansione = newMassimaSansione End Sub Public Sub setMinimaSansione(newMinimaSansione As Single) Me.MinimaSansione = newMinimaSansione End Sub Public Sub setMassimeRate(newMassimeRate As Integer) Me.MassimeRate = newMassimeRate End Sub End Class

Codice che richiama la funzione da una Form in VB.NET :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.alpacasrl.it

leviathan89 Profilo | Newbie

Poi domani quando torno da lavoro gli do un'occhiata più approfondita, in pratica inserendo la sanzione su di una textbox mi deve dare la rata in una label.il procedimento è sempre quello che ho detto prima.

ridaria Profilo | Expert

>Salve, quando si tratta di numeri rischio di impazzire, spero
>in un vostro aiuto.
>Vi spiego il programma:
>
>Ho tre fasce di sanzioni:
>1) fascia comprende numeri da 211 a 2108.00 con rate autorizzate
>massimo a 12
>2) fascia comprende numeri da 2108.01 a 5270.00 con rate autorizzate
>massimo a 24
>3 ) fascia comprende numeri da 5270.01 a 99999.99 con rate autorizzate
>massimo a 60
>
>Il programma in questo caso deve farmi un controllo; se la sanzione
>inserita nella prima fascia, dividendola per 105 è superiore
>a 12 allora il programma deve scrivere 12, se è inferiore a 12
>deve scrivere il risultato però arrotondando per difetto, ovvero
>se è 2,4 deve scrivere 2, se è 2,8 deve scrivere sempre 2. Stessa
>cosa vale per il resto, inserita una sanzione della seconda fascia
>se la divido per 105 è superiore a 24 deve scrivere il suo risultato
>sempre arrotondando per difetto.
>Io quando ho di mezzo i numeri impazzisco, so che è una cavolata.
>Facendolo con una fascia sola riesco ma con le altre non riporta.
se riesci con la prima fascia e con le altre no vuol dire che c'è un errore nel codice.

Riguarda meglio il codice delle altre fasce che di sicuro il problema sta lì.

Ciao


>Vi ringrazio anticipamente.

Prego

>Buona giornata
>

Riccardo D'Aria

Davide1986 Profilo | Junior Member

Posta il codice cosi possiamo vedere dove sbagli.. Comunque se prendi il mio codice ci metti poco a farlo funzionare.. devi fare solo un cast da un valore di testo e trasformarlo in un numero float ..

Ti allego i file in c# : http://www.mediafire.com/download/46nyoz164a3brq6/ProvaNumeri.rar

Ti allego il file in VB.NET (Ho aggiunto una Text Box che riceve solo numeri + Label Risultato ): http://www.mediafire.com/download/q3xn3j95bctxn99/Sanzione.rar

Fammi sapere se ti è servito...

Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.alpacasrl.it

leviathan89 Profilo | Newbie

Non capisco perché se inserisco 2108.01 mi da come valore -1 stessa cosa se metto sopra a 50000 o a 90000

Davide1986 Profilo | Junior Member

Ho fatto un pò di Debug e mi sono accorto che il For lo facevo finire prima solo sui primi due elementi venivano verificati e quindi la terza fascia veniva saltata , quindi lo devi cambiare in :

Vecchio
For i As Integer = 1 To 2

Aggiornato
For i As Integer = 1 To 3

Poi mi sono accorto che la conversione del numero da Stringa in numero Single era sbagliata e quindi ti passo la nuova stringa da sostituire:

Aggiornato i valori dentro il tasto Button Calcola :
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Puoi scaricare la versione aggiornata : http://www.mediafire.com/download/q3xn3j95bctxn99/Sanzione.rar

Fammi sapere...

PS. Ti consiglio di utilizzare un MaskedTextBox invece di una TextBox cosi la puoi formattare come ti pare e piace qui trovi le info :
http://msdn.microsoft.com/it-it/library/system.windows.forms.maskedtextbox.mask(v=vs.110).aspx

Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.alpacasrl.it

leviathan89 Profilo | Newbie

Perfetto il codice, ti vi ringrazio. Un problema però. Ho un controllo che non puoi inserire un valore inferiore a 211. In quel caso mi esce -1 è possibile lasciarla vuota? mettendo la label.text = "" non mi da nulla.

Davide1986 Profilo | Junior Member

Puoi modificare il tasto Button in questa maniera :

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

Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.alpacasrl.it
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