none
Verificare numero decimale

    Question

  • Buonasera a tutti.

    Avrei necessità di sapere se con ASP NET (C#) è possibile verificare quando un risultato numerico decimale, estratto tramite l'esecuzione di una differenza aritmetica all'interno di una query, è un numero negativo o no.

    Grazie per l'aiuto.



    • Edited by cms9651 Wednesday, June 27, 2012 6:33 PM
    Wednesday, June 27, 2012 6:27 PM

Answers

All replies

  • Ciao cms9651,

    You wrote on 27/06/2012 :

    Avrei necessità di sapere se con ASP NET (C#) è possibile verificare quando un numero decimale, estratto tramite l'esecuzione di una query, è un numero negativo o no.

    mi perdo qualcosa per strada io per cui:

    var negativo = mioNumero < 0;

    ?

    .m



    blog @ //milestone.topics.it
    Wednesday, June 27, 2012 6:54 PM
  • Ciao Mauro e grazie per la gentile risposta.

    Spiego meglio il problema anche con qualche riga di codice ASP NET.

    In pratica eseguendo il calcolo all'interno della query il risultato può essere negativo o positivo.

    Quando il risultato è positivo devo anteporre il segno `+` davanti al risultato.

    Il codice è questo, ma restituisce l'errore: Formato della stringa di input non corretto.

    OdbcConnection myConnectionString = 
               new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString);
           myConnectionString.Open();       
    
           String strQuery = "  SELECT (CampoNumericoDecimaleUno - CampoNumericoDecimaleDue) AS top FROM qTable;";
      
           OdbcCommand objCmd = new OdbcCommand(strQuery, myConnectionString);
           objCmd.Prepare();
           objCmd.CommandType = CommandType.Text;
           objCmd.CommandText = strQuery;
    
           OdbcDataReader reader = objCmd.ExecuteReader();
           reader.Read();
    
           string top = "--";
                if (!reader.IsDBNull(0))
                {
                    top = reader[0].ToString();
                    
                    if (Int32.Parse(top) > 0)
                    {
                         top = string.Format("+{0}%", top);
                    }
                    else
                        if (Int32.Parse(top) < 0)
                        {
    
                             top = string.Format("-{0}%", top);
                        }
                        else
                        {
                             top = string.Format("{0}%", top);
                        }
    
                }
    
           reader.Close();
           reader.Dispose(); 
    
           objCmd.Dispose();
           
           myConnectionString.Close();
           myConnectionString.Dispose(); 

    Wednesday, June 27, 2012 7:08 PM
  • ASP.NET e C# sono cose distinte.

    C# è uno dei linguaggi disponibili in .NET, ASP.NET è la tecnologia web.

    Detto questo, fai un semplice confronto per verificare se il numero è minore di 0:
    var number = -0.3d;
    var negative = number < 0;


    Matteo Migliore

    Bloghttp://blogs.ugidotnet.org/matteomigliore
    Twitterhttp://twitter.com/matteomigliore
    CodePlex

    Wednesday, June 27, 2012 8:03 PM
  • Controlla che il valore di reader[0] perchè probabilmente è quello a non essere un numero valido. In caso ti andasse bene che il campo possa anche non contenere numeri dovresti usare int.TryParse, altrimenti potresti impostare anche sul DB che la colonna sia di tipo int e non stringa, per evitare il parsing, in questo modo potresti fare un semplice cast.

    Infine, per aggiungere il segno positivo ti basta questo:
    var top = "--";
    
    if (!reader.IsDBNull(0))
    {
        top = (string)reader[0];
        var value = int.Parse(top);
        top = string.Format("{0}{1}%", (value > 0) ? "+" : null, value);
    }


    Matteo Migliore

    Bloghttp://blogs.ugidotnet.org/matteomigliore
    Twitterhttp://twitter.com/matteomigliore
    CodePlex


    Wednesday, June 27, 2012 8:27 PM
  • Ciao Matteo e grazie per la gentile risposta.

    Ho seguito le tue indicazioni, ma la pagina continua a dare errore:

    Errore server nell'applicazione '/WebApplication1'.

    Formato della stringa di input non corretto.

    Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere la traccia dello stack. 

    Dettagli eccezione: System.FormatException: Formato della stringa di input non corretto.

    Errore nel codice sorgente: 
    Riga 153:           {
    Riga 154:           top = (string)reader[0];
    Riga 155:           var value = int.Parse(top);
    Riga 156:           top = string.Format("{0}{1}%", (value > 0) ? "+" : null, value);
    Riga 157:           }

    Eppure nel debug la variabile `top` si valorizza correttamente (-3.9).

    Cosa sbaglio?

    Grazie


    • Edited by cms9651 Friday, June 29, 2012 8:54 PM
    Friday, June 29, 2012 7:34 PM
  • Ciao cms9651,

    You wrote on 29/06/2012 :

    Riga 153:                     {
    Riga 154:                     top = (string)reader[0];
    Riga 155:                     var value = int.Parse(top);
    Riga 156:                     top = string.Format("{0}{1}%", (value > 0) ? "+" : null,
    value);
    Riga 157:                     }



    Eppure nel debug la variabile `top` si valorizza correttamente (-3.9).

    Cosa sbaglio?

    3.9 non è un intero, non puoi usare Int32.Parse, devi usare qualcosa che sia in grado di gestire i decimali, come Double.Parse (o meglio ancora TryParse)

    .m



    blog @ //milestone.topics.it
    Saturday, June 30, 2012 4:58 AM
  • Grazie.

    Ho modificato secondo tue indicazioni, non ho errori ma l'iniziale numero decimale -3.9 diventa -39.

    E quando il valore è positivo non antepone il segno "+" davanti al valore.

    :(

    var Variazione = "--";
    
           if (!reader.IsDBNull(0))
               {
               Variazione = (string)reader[0];
               var value = Decimal.Parse(Variazione); 
               Variazione = string.Format("{0}{1}", (value > 0) ? "+" : null, value);#");
               }


    • Edited by cms9651 Saturday, June 30, 2012 1:55 PM
    Saturday, June 30, 2012 1:54 PM
  • Il separatore decimale dipende dalla culture, evidentemente la tua applicazione gira con una culture, probabilmente quella italiana, dipende da come è impostata quella del sistema operativo, che non usa il punto come separatore, tipico di quella anglosassone e altre.

    Quindi per risolvere devi impostare con quale culture venga effettuato il parsing della string in numero:
    var enCulture = CultureInfo.CreateSpecificCulture("en");
    decimal.Parse(variazione, enCulture);
    

    Attenzione anche alle nomenclatura, per aderire correttamente alle naming convention puoi usare un tool come StyleCop.

    Matteo Migliore

    Bloghttp://blogs.ugidotnet.org/matteomigliore
    Twitterhttp://twitter.com/matteomigliore
    CodePlex

    • Marked as answer by cms9651 Monday, July 02, 2012 8:17 AM
    Saturday, June 30, 2012 11:48 PM
  • Grazie, risolto!

           var Variazione = "--";
           if (!reader.IsDBNull(0))
               {
               Variazione = (string)reader[4];
               var enCulture = CultureInfo.CreateSpecificCulture("en");
               var value = Decimal.Parse(Variazione, enCulture);
               Variazione = string.Format("{0}{1}%", (value > 0) ? "+" : null, value);
               }


    Monday, July 02, 2012 8:17 AM