Oppure

Loading
15/02/23 10:13
Carlo
Postato originariamente da pacifico:
Inserendo i numeri interi, la somma risulta perfetta viceversa inserendo i numeri decimali, no.
Per i numeri decimali ho inserito:
5.23+6+45.12+5.24+3.21 e la somma dovrebbe essere di: 64.80 mentre risulta: 5886.
Il codice usato grazie a Carlo che saluto:

double Totale = 0;
for (int i = 0; i < DataGridView.Rows.Count; i++)
{
   double col2 = 0;  
//tentativo di conversione da string a double
if (double.TryParse(DataGridView.Rows[i].Cells["Tabella A"].Value.ToString(), out col2))
{
 Totale += col2; // se la conversione è andata a buon fine
}
}
DataGridView.Rows.Add(6, "Totale", Totale);

per il codice riguardo ai numeri interi:

Int Totale = 0;
for (int i = 0; i < DataGridView.Rows.Count; i++)
{
  int col2 = 0;
//tentativo di conversione da string a int
if (int.TryParse(DataGridView.Rows[i].Cells["Tabella A"].Value.ToString(), out col2))
{
 Totale += col2; // se la conversione è andata a buon fine
}
}
DataGridView.Rows.Add(6, "Totale", Totale);


Gentilmente per modificare i codici per la visualizzazione al totale delle migliaia e decimali. (#,##0,###).


non servono due codici per numeri interi e non, quello con la conversione in double che puoi cambiare anche in decimal come consiglia Thejuster va bene per entrambi.

Il tuo problema risiede nel fatto che hai inserito i valori nell'XML con il formato americano dove si usa il punto decimale, mentre il tuo PC sicuramente è impostato sulla cultura "it-IT" dove invece si usano le virgole decimali.
Per verificare se sostituisci i punti con le virgole nell'XML vedrai che la somma sarà corretta.
Per fare in modo che i punti decimali sino correttamente interpretati nel tuo PC localizzato in Italia, puoi temporaneamente cambiare l'impostazione ma poi se in un'altra tabella inserirai numeri con le virgole decimali il programma non rifunzionerà più.
Al tuo codice vanno inserite due righe:
private void Carica_TabellaA()
{
    // Cambio temporaneo dell'interpretazione del separatore decimale
    System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
    customCulture.NumberFormat.NumberDecimalSeparator = ".";
    System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;

    DataGridView.Rows.Clear();

    string[] elementi_passati = new string[Percorso.Conta_numero_elementi_TabellaA()];

    elementi_passati = Percorso.Carica_contenuto_elementiTabellaA();
    for (int y = 0; y < elementi_passati.Length; y++)
    {
        XmlDocument DocumentoXml = new XmlDocument();
        DocumentoXml.Load(elementi_passati[y]);
        string idContatto = System.IO.Path.GetFileNameWithoutExtension(elementi_passati[y]);
        XmlNode nodotextbox5 = DocumentoXml.DocumentElement.SelectSingleNode("/contatto/textbox5");
        XmlNode nodotextbox6 = DocumentoXml.DocumentElement.SelectSingleNode("/contatto/textbox6");
        XmlNode nodotextbox7 = DocumentoXml.DocumentElement.SelectSingleNode("/contatto/textbox7");
        XmlNode nodotextbox8 = DocumentoXml.DocumentElement.SelectSingleNode("/contatto/textbox8");
        XmlNode nodotextbox9 = DocumentoXml.DocumentElement.SelectSingleNode("/contatto/textbox9");

        string[] nuovarigaA = { idContatto, nodotextbox5.InnerText, nodotextbox6.InnerText, nodotextbox7.InnerText, nodotextbox8.InnerText, nodotextbox9.InnerText };

        DataGridView.Rows.Add(1, " ", nodotextbox5.InnerText);
        DataGridView.Rows.Add(2, " ", nodotextbox6.InnerText);
        DataGridView.Rows.Add(3, " ", nodotextbox7.InnerText);
        DataGridView.Rows.Add(4, " ", nodotextbox8.InnerText);
        DataGridView.Rows.Add(5, " ", nodotextbox9.InnerText);


        decimal Totale = 0; //decimal
        for (int i = 0; i < DataGridView.Rows.Count; i++)
        {
            decimal col2 = 0; //decimal
            //tentativo di conversione da string a decimal
            if (decimal.TryParse(DataGridView.Rows[i].Cells["Tabella A"].Value.ToString(), out col2))
            {
                Totale += col2; // se la conversione è andata a buon fine
            }
        }
        DataGridView.Rows.Add(6, "Totale", Totale.ToString("0.00")); // formattato con due decimali
    }
}
Ultima modifica effettuata da Carlo 15/02/23 10:46
in programmazione tutto è permesso
15/02/23 10:58
pacifico
Gent.mo Carlo,

grazie per la tempestività.

Modificando il totale in:

DataGridView.Rows.Add(6, "Totale" Totale.ToString("#,##0.00"));

effettivamente serve solo il primo codice.

Funziona.

Auguro una buona giornata, saluto
Domnico.
aaa
15/02/23 13:03
Carlo
Postato originariamente da pacifico:

Modificando il totale in:
DataGridView.Rows.Add(6, "Totale" Totale.ToString("#,##0.00"));


Così facendo se il PC è settato su "it-IT" ed hai cambiato il separatore decimale in un punto, ti ritroverai i punti sia per separare i decimali che per separare le terzine.
Per una corretta formattazione americana es: 1,456,728.07
devi modificare anche il NumberGroupSeparator
 // Cambio temporaneo dell'interpretazione del separatore decimale e dei gruppi di tre cifre
System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
customCulture.NumberFormat.NumberDecimalSeparator = ".";
customCulture.NumberFormat.NumberGroupSeparator = ",";
System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;

Se lavori anche con le date in formato americano, allora conviene cambiare tutta la currentCulture:
// Cambio temporaneo della cultura
System.Globalization.CultureInfo usCulture = new System.Globalization.CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentCulture = usCulture;
Ultima modifica effettuata da Carlo 15/02/23 13:43
in programmazione tutto è permesso