263 messaggi dal 08 aprile 2009
Ho una domanda da utente alle primissime armi
Le pagine asp.net (vb net come code behind) sono pagine che, se non mi sbagli, eseguono codice lato server. Questo dovrebbe significare che se io ho un dato numerico (decimale) il carattere che viene interpretato come separatore decimale, è quello impostato sul server ASP. Corretto????
Perchè sto impazzendo con un utente americano da cui mi torna sempre un errore di "System.FormatException: Input string was not in a correct format." da una function in cui utilizzo dati numerici per fare alcune operazioni matematiche
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

galbori ha scritto:

il carattere che viene interpretato come separatore decimale, è quello impostato sul server ASP

Per brevità diciamo di sì, ma ASP.NET ti consente impostare una Culture diversa per ogni richiesta di pagina, così da accomodare le abitudini dei vari utenti.
Per "Culture" si intende l'insieme delle convenzioni in uso in un dato paese.
La Culture it-IT, per esempio, prevede che il separatore dei decimali sia la virgola, mentre per la Culture en-US il punto.

Al momento, penso che nella tua applicazione tu stia usando sempre la Culture it-IT che ovviamente non è adeguata per l'utente statunitense. Per cambiare dinamicamente la Culture, ti basta aprire il web.config e inserire il nodo <globalization> dentro <system.web> (se ce l'hai già, aggiornalo come segue):
<globalization uiCulture="auto" culture="auto" />

In questo modo ASP.NET imposterà la Culture appropriata per l'utente senza che tu debba far nulla. Riesce a farlo accuratamente nella maggior parte dei casi perché i browser, quando inviano una richiesta al server, indicano sempre qual è la lingua preferita dall'utente (intestazione Accept-Language).

A questo punto, quando lato server usi dei metodi tipo Parse, verrà tenuta in considerazione la Culture impostata da ASP.NET e l'errore dovrebbe sparire.
var valore = Decimal.Parse(casellaNumerica.Text);


Qui c'è un'altra discussione sull'argomento:
http://forum.aspitalia.com/forum/post/410054/Data-Inserita-PC-S.O.-Inglese.aspx

E qui trovi la documentazione sulla globalizzazione delle applicazioni ASP.NET.

ciao,
Moreno
Modificato da BrightSoul il 30 dicembre 2015 15.24 -

Enjoy learning and just keep making
263 messaggi dal 08 aprile 2009
Ok, grazie della speigazione e dei riferimenti
Nel mio caso specifico, però io non credo di avere necessita di cambiare la culture, in effetti nella pagina l'utente inserisce un codice, io estraggo da sql server il prezzo che viene poi manipolato tramite una scontistica legata all'utente che si è logato e poi visualizzato in una grid
A me in realtà poco importa che venga visualizzato con il . o con la ,

Temo che il problema sdia proprio legato al fatto che io modifico la culture per altre ragioni e questo fa casino
11.886 messaggi dal 09 febbraio 2002
Contributi
Però in questo caso non si tratta solo di visualizzazione del prezzo.
L'errore che hai riportato è il seguente:


System.FormatException: Input string was not in a correct format.


La FormatException è un'eccezione che tipicamente viene sollevata quando si prova a convertire una stringa in un altro tipo di dato (es. numeri, date, ...) e ciò fallisce perché quella stringa non è interpretabile tale secondo le impostazioni della Culture corrente.

Guarda per esempio che succede quando provo a parsare una stringa che contiene la data di oggi usando la Culture predefinita del server (quella statutitense, che usa invece il formato mm/gg/aaaa).
https://dotnetfiddle.net/6idkpZ

Dato che hai detto che il problema si verifica solo con l'utente americano, penso che la questione da risolvere sia quella della Culture.

Comunque, esserne sicuri, posta la riga di codice che sta sollevando la FormatException.


Temo che il problema sdia proprio legato al fatto che io modifico la culture per altre ragioni

Spiega quali sono le ragioni ed eventualmente posta il codice in cui la modifichi.

ciao,
Moreno
Modificato da BrightSoul il 30 dicembre 2015 15.40 -

Enjoy learning and just keep making
263 messaggi dal 08 aprile 2009
La riga che da errore è questa

retValue = (Double.Parse(costo) * (1 + Double.Parse(hdMaggiorazione.Value) / 100)).ToString("F2")

Sicuramente l'errore l'ottengo in uno dei parse.

Il mio server restituisce numeri formattati con la virgola come separatore decimale, l'americano però ha il punto

Io per altre ragioni avevo fatto un override di InitializeCulture
in cui andavo a forzare la culture legata al pc client, quindi con l'americano mi carica come separatore decimale il punto e penso che i miei guai derivino da lì
11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, metti un breakpoint in quella riga, poi lancia l'applicazione in debug e verifica che valori assumono la variabile costo e la proprietà hdMaggiorazione.Value.

Usa questa estensione di Firefox per impostare en-US come lingua preferita, così che tu possa simulare l'utente americano.
https://addons.mozilla.org/it/firefox/addon/quick-accept-language-switc/
Ovviamente digita i valori usando il punto come separatore dei decimali.

galbori ha scritto:

Io per altre ragioni avevo fatto un override di InitializeCulture

Ok, metti un breakpoint anche lì dentro e verifica che venga effettivamente impostata la Culture corretta.

Il problema è circoscritto, quindi penso che così riusciremo ad identificarlo abbastanza agevolmente.

ciao,
Moreno
Modificato da BrightSoul il 30 dicembre 2015 15.55 -

Enjoy learning and just keep making
263 messaggi dal 08 aprile 2009
L'estensione che mi hai segnalato è proprio quella che mi serve per isolare il mio problema, purtroppo l'ho installata, ma non mi salta fuori da nessuna parte. Io uso Mozilla allineato all'ultimo aggiornamento. E' un problema di compatibilità o manca qualche passo?
11.886 messaggi dal 09 febbraio 2002
Contributi
Sì, ho anche io la versione più recente (43.0.3). Dovrebbe comparirti un nuovo bottone nella toolbar, come vedi qui.
Se non ti compare, fai tasto destro sulla toolbar -> Personalizza (oppure clicca l'icona del menu -> Personalizza). A quel punto troverai il bottone tra quelli disponibili e potrai trascinarlo sopra.
Modificato da BrightSoul il 30 dicembre 2015 16.26 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.