Problema virgola

martedì 04 maggio 2010 - 16.53

andreadp Profilo | Junior Member

Salve a tutti, nella mia applicazione c# avrei il problema di permettere per alcuni textbox e per un datagrid di permetteere l'inserimento di soli numeri e di formattare il . come separatore decimale. Ho avuto parecchi problemi potete aiutarmi??

Grazie mille


Andrea

nico839 Profilo | Senior Member

ciao, per quanto riguarda la textbox solo numeri potresti agire sull'evento keypress e utilizzare la funzione IsNumeric per verificare che siano inseriti solo numeri, oppure operare attraverso le regular expression, magari costruendoti uno user control da riutilizzare.

andreadp Profilo | Junior Member

Si infatti ...il problema maggiore sta nella virgola...
Andrea

nico839 Profilo | Senior Member

se le tratti come stringhe potresti fare un replace, altrimenti penso che prenda le impostazioni internazionali del pc....

andreadp Profilo | Junior Member

però non lo riconosce come separatore decimale..:-(
Andrea

nico839 Profilo | Senior Member

una cosa tipo FormatNumber che permette di settare anche i separatori?

perchè io in una applicazione che tirava su dei dati da excel, avendo office in inglese , mi vedeva dei numeri moltiplicati per mille, e per ovviare a ciò, dove utilizzavo le funzioni di excel ho impostato che se la lingua di office era inglese , prima di ogni operazione faceva un bel

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

x adattare il tutto alla stessa lingua e fargli capire come intendeva i separatori....

DomA Profilo | Expert

Ciao Andrea,
se ho capito bene hai la necesità di sostituire il punto con la virgola.
>>In questo caso devi utilizzare la funzione replace:

Tuo_N_Formattato = Replace(TxtTuoNum.Text, ".", ",")

più sepmplice, più elegante... più Smart
Domenico

nico839 Profilo | Senior Member

>Ciao Andrea,
>se ho capito bene hai la necesità di sostituire il punto con
>la virgola.
>>>In questo caso devi utilizzare la funzione replace:
>
>Tuo_N_Formattato = Replace(TxtTuoNum.Text, ".", ",")
>
>più sepmplice, più elegante... più Smart
>Domenico

trattato come stringa è la soluzione ottimale!ma quando lo si riusa come numero si deve rifare la replace contraria?

DomA Profilo | Expert

>>trattato come stringa è la soluzione ottimale!ma quando lo si riusa come numero si deve rifare la replace contraria?

Ciao nico,
non vedo la necessità poichè, il risultato è sempre un numero.

Esempio:

Dim N1 as single = Replace(TxtNumero.Text, ".", ",")

il risultato è un valore di tipo single.
Ciao,

Domenico

freeteo Profilo | Guru

Ciao,
potresti controllare l'evento "keydown" della textBox e verificare quello che vuoi, ad esempio:

private void textBox1_KeyDown(object sender, KeyEventArgs e) { char c = (char)e.KeyValue; bool ok = false; //--- range di numeri, il punto ed altri casi speciali if ((c > 47 && c < 58) || (e.KeyCode == Keys.OemPeriod && !textBox1.Text.Contains(".")) || e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right ) ok = true; e.SuppressKeyPress = !ok; }
o cose di questo genere...quindi diciamo che dentro li puoi fare qualsiasi controllo che vuoi...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

nico839 Profilo | Senior Member

@ Domenico : Interessante!grazie dell'illuminazione!

DomA Profilo | Expert

Ciao Matteo,
come al solito sei grande. Tuttavia io utilizzerei l'evento LostFocus per verificare prima, se il valore inserito è un numero, e poi, utilizzare il replace per sostituire l'eventuale punto con la virgola.
Tu come la vedi?
Ciao,
Domenico

freeteo Profilo | Guru

Ciao,
grazie DomA per i complimenti, anche se non mi si addicono molto li accetto sempre volentieri

Cmq il "LostFocus" avviene dopo che hanno premuto i tasti, il mio evento intercetta la pressione del tasto e sopprime se l'utente non ha scritto un valore corretto (numeri, il punto [uno solo] oppure qualche tasto utile per muoversi diciamo...).

Il tuo spunto del LostFocus è però da tenere in considerazione, nel senso che il valore della textBox potrebbe arrivare da un copia-incolla, o da un binding di dati il valore sulla textbox, e quindi all'uscita del controllo (lostfocus appunto) potresti fare qualche altra modifica come la formattazione...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

DomA Profilo | Expert

>> sopprime se l'utente non ha scritto un valore corretto (numeri, il punto [uno solo]

non avevo pensato ad errori "di_gitazione" da parte dell'utente. In effetti lostfocus prima permette l'errore e dopo si invia il msg...
Invece il controllo con il keydown è immediato.
Grazie,
Domenico

andreadp Profilo | Junior Member

Ho provato come suggerito, ma se scrivo 44.5 mi viene fuori 445,00---dove sta il problema??
Andrea

freeteo Profilo | Guru

>Ho provato come suggerito, ma se scrivo 44.5 mi viene fuori 445,00---dove
>sta il problema??
allega un esempio veloce che ripresenta il problema, che vediamo di modificare direttamente il codice...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

nico839 Profilo | Senior Member

ciao...prova a guardare anche qui

http://msdn.microsoft.com/en-us/library/ms229644(VS.80).aspx

e qui un esempio

http://forum.masterdrive.it/progetti-open-source-45/vb-net-textbox-per-formattazione-numeri-23148/

DomA Profilo | Expert

Ciao,
ti allego un piccolo esempio in vb.net.
Puoi usere i traduttori online per portarlo in c#.
fammi sapere se è ciò che ti serve.
A presto,

Domenico

andreadp Profilo | Junior Member

Per completezza di informazione: nel momento in cui vado a fare l'inserimento nel db del valore nel textbox lo converto in decimal.
Nella mia tabella il valore è impostato numeric.
Ancora non riesco a risolvere...Ufff
Andrea

DomA Profilo | Expert

Hai visto l'esempio che ti ho postato?

>>Per completezza di informazione: nel momento in cui vado a fare l'inserimento nel db del valore nel textbox lo converto in decimal. Nella mia tabella il valore è impostato numeric.
Prova ad impostare il formato nel campo single (con un determinato n° di decimali).
Scusa, forse me lo son perso, che tipo di db usi (Access, SQL Server...)
Ciao,
Domenico

andreadp Profilo | Junior Member

uso sql server
Andrea

andreadp Profilo | Junior Member

http://msdn.microsoft.com/it-it/library/0c899ak8%28VS.95%29.aspx#SpecifierPt

Potrebbe tornare utile nel mio caso??
Andrea

nico839 Profilo | Senior Member

ciao, secondo me si, ai ad agire sulle cultureinfo...
cmq qui

http://forum.masterdrive.it/progetti-open-source-45/vb-net-textbox-per-formattazione-numeri-23148/

c'è un'esempio che secondo me fa un po quello che cerchi

andreadp Profilo | Junior Member

Niente non sono proprio riuscito ancora....
Help...:-(
Andrea

Fako Profilo | Newbie

Ciao,
per evitare problemi con le virgole e i punti io faccio la seguente cosa che sembra funzionare sempre:

String NumberSeparator = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator;
if (NumberSeparator == ",")
valore = valore.Replace('.', ',');
else
valore = valore.Replace(',', '.');

se un utente inserisce la virgola ma la culture del pc o server e . allora avviene la sostituzione.
per altre esigenze la currentculture identifica tutto tipo datetime format e altro (praticamente quello che c'è nelle impostazioni internazionali)

quindi se per esempio si inserisce un numero con la virgola ma ci va il punto quando premi invio fai la sostituzione.

Ciao

andreadp Profilo | Junior Member

Perfetto. D'accordissimo. Il problema sorge quando devo fare l'arrotondamento a 4 cifre decimali dopo la virgola.
Andrea

DomA Profilo | Expert

Ciao e scusa per l'assenza.
Per l'arrotondamento prova Math.Round.
Math.Round(valore, n) dove n è il numero di decimali dopo la virgola.
Ciao,
Domenico

andreadp Profilo | Junior Member

Ok..ma precisamente dove utilizzo questa istruzione??
Grazie
Andrea

DomA Profilo | Expert

Facciamo le cose con ordine:
1) Sostituisci il punto con la virgola:

if (NumberSeparator == ",")
valore = valore.Replace('.', ',');
else
valore = valore.Replace(',', '.');

2) arrotondi il n° dei decimali

double ValArrotondato =Math.Round(double.Parse(valore), 4);
dove 4 indica il n° di decimali dopo la virgola.
A presto.
Domenico

andreadp Profilo | Junior Member

e quindi sul db il dato dovrebbe essere di tipi double?!?
Io non capisco però perchè deve accadere solo con quel text box..
Andrea
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5