+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 7 su 7

Problemi con gestione stringhe

  1. #1
    Salve a tutti, ho problemi con la formattazione di alcuni dati.

    Ho necessità di racchiudere 3 valori numerici in una stringa (le 3 coordinate di un punto).

    int coordx = DistanzaTotaleXcentro + Globale.Griglia.LineaX[k].Distanza;
    int coordy = DistanzaTotaleYcentro + Globale.Griglia.LineaY[i].Distanza;
    int coordz = distanzaz;
    string guid = "Z"+ coordx.ToString("000000")+ coordy.ToString("000000")+coordz.ToString("000000") , "puntigriglia");
    
    funziona bene con i valori positivi.
    esempio
    x= 2000
    y= 3000
    z=200

    la stringa è:
    Z002000003000000200

    quando riprendo da una'altra parte con:
    int x = Convert.ToInt32(cd.id.Substring(1, 6));
    int y = Convert.ToInt32(cd.id.Substring(7, 6));
    int z = Convert.ToInt32(cd.id.Substring(13, 6));
    
    Funziona bene.

    Quando invece, raramente c'è qualche valore negativo, sballa tutto.

    x= -2000
    y= 3000
    z=200
    la stringa diventa:
    Z-00200003000000200

    estraendo ottengo:
    cd.id.Substring(1, 6) = -00200

    int x = Convert.ToInt32(cd.id.Substring(1, 6));
    quindi:
    x=-200

    praticamente il meno occupa uno spazio e si mangia uno zero.


    l'unica cosa che mi viene in mente è mettere un carattere in più do occupare solo il segno + o -.

    Come pensate sia possibile risolvere?

    Salute
    Sebastiano Floridia

  2. #2
    Sgrubak non è in linea Scribacchino
    Matematicamente parlando, un numero senza il segno non ha senso.
    Hai varie strade:
    - lo gestisci come hai già suggerito;
    - frapponi alla stringa dei caratteri che identifichino l'inizio di ciascuna coordinata, così da rendere sottinteso il + nei valori positivi, ad esempio [Zcx-002000cy03000cz000200], ma resta più macchinoso fare poi il parsing della stringa per riottenere le coordinate. Ti permette però di salvarle anche in ordine diverso da X-Y-Z, o di ometterne qualcuna per sottindenderla 0;
    - frapponi alla stringa un carattere fisso che ti permetta con un semplice Split un array ciclabile per riottenere il valore numerico con int.Parse, così potresti addirittura omettere gli zeri antecedenti. Esempio: [Z|-2000|3000|200]

    Questi sono un paio di esempi che mi vengono in mente così al volo...

  3. #3
    Grazie!

    Mi piace molto l'ultima.
    verifico che non vada il contrasto con la key di selezione del mondo grafico opengl.
    Grazie
    Sebastiano Floridia

  4. #4
    Non capisco perché usi le stringhe con questa doppia conversione al posto delle strutture fatte apposta allo scopo.

    Comunque, se vuoi inserire i valori in una stringa ti consiglio la codifica esadecimale a 8 caratteri, così

                int coordx = 500;
                int coordy = 1000;
                int coordz = -2000;
                string guid = "Z" + coordx.ToString("X8") + coordy.ToString("X8") + coordz.ToString("X8");
    
    e poi

                int x = Convert.ToInt32(guid.Substring(1, 8), 16);
                int y = Convert.ToInt32(guid.Substring(9, 8), 16);
                int z = Convert.ToInt32(guid.Substring(17, 8), 16);
    
    Però, ripeto, l'uso delle stringhe in questo modo mi sembra molto inefficiente.
    ℹ️ Leggi di più su AntonioG ...

  5. #5
    Grazie!!!
    Purtroppo va dentro una funzione che accetta solo una stringa, di un componente esterno che gestisce un motore grafico opengl.
    Purtroppo non c'è alternativa. una string che contiene tutte le informazioni.

    Grazie
    Sebastiano Floridia

  6. Quote Originariamente inviato da SebastianoFloridia Visualizza il messaggio
    Purtroppo va dentro una funzione che accetta solo una stringa, di un componente esterno che gestisce un motore grafico opengl.
    Ciao,
    non sono sicurissimo di aver capito cosa ti occorre ... ma tentar non nuoce
      class Program
        {
            static void Main(string[] args)
            {
                int x = -1000;
                int y = -20000; // -2000000
                int z = 3;
    
                var sZ = "Z" + ConvertToOpenGl(x) + ConvertToOpenGl(y) + ConvertToOpenGl(z);
    
                Console.WriteLine(sZ);
    
    
              x = Convert.ToInt32(sZ.Substring(1, 6));
              y = Convert.ToInt32(sZ.Substring(7, 6));
              z = Convert.ToInt32(sZ.Substring(13, 6));
    
                Console.WriteLine(x + "," + y +"," + z);
    
                Console.ReadLine();
    
            }
    
            private static string ConvertToOpenGl( int i )
            {
                var sRes = string.Empty;
    
                if (i<0)
                { 
                    sRes = (-i).ToString("000000");
                    if (sRes[0] == '0')
                        sRes = "-" + sRes.Substring(1);
                    else
                        throw new Exception("6 caratteri sono insufficienti");
                }
                else
                    sRes = i.ToString("000000");
               
                 /* se hai bisogno di verificare i dati
                if (sRes.Length>6)
                        throw new Exception("6 caratteri sono insufficienti");
                 */
    
                return sRes;
            }
        }
    
    HTH
    Ultima modifica di sspintux; 25-04-2020 16:23 
    ℹ️ Leggi di più su sspintux ...

  7. #7
    Grazie a tutti!!!
    Ho utilizzato un mix di tutte queste proposte!!!

    Saluti
    Sebastiano Floridia

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Problema con gestione stringhe
    Da lenna85 nel forum Visual Basic .Net
    Risposte: 7
    Ultimo Post: 18-10-2014, 11:20
  2. Access gestione stringhe numeriche
    Da fohsb nel forum Microsoft Access
    Risposte: 1
    Ultimo Post: 24-08-2009, 10:55
  3. problemi gestione eventi in c++
    Da il pollo nel forum C/C++
    Risposte: 1
    Ultimo Post: 21-11-2008, 21:38
  4. Gestione stringhe
    Da RobertoDG nel forum Delphi
    Risposte: 3
    Ultimo Post: 29-11-2006, 19:26
  5. Gestione stringhe
    Da lucagfc nel forum Visual Basic 6
    Risposte: 8
    Ultimo Post: 05-07-2006, 13:44