Parsing sicuro: TryParse vs Parse¶
Parse è rischioso quando non si è sicuri che la stringa sia valida (campo vuoto, utente che non ha ancora inserito nulla, dato sporco).
Perché Parse è rischioso¶
Se prezzoStr è vuota (""), null, o contiene qualcosa di non numerico, viene lanciata un'eccezione (FormatException o ArgumentNullException). Nei form SAP, i UserDataSource vuoti restituiscono spesso stringa vuota (non null), quindi il caso capita più spesso di quanto si pensi.
Con TryParse¶
using System.Globalization;
string prezzoStr = oForm.DataSources.UserDataSources.Item("UnitPrice").ValueEx;
if (double.TryParse(prezzoStr, NumberStyles.Any, CultureInfo.InvariantCulture, out double prezzo))
{
double risultato = Math.Round(prezzo * 2, 2);
oForm.DataSources.UserDataSources.Item("UnitPrice").ValueEx =
risultato.ToString(CultureInfo.InvariantCulture);
}
else
{
// Gestire il caso: valore vuoto o non valido
SBO_Application.StatusBar.SetText("Prezzo non valido",
SAPbouiCOM.BoMessageTime.bmt_Short,
SAPbouiCOM.BoStatusBarMessageType.smt_Warning);
}
Perché NumberStyles.Any¶
L'overload semplice di TryParse accetta di default un formato abbastanza rigido. NumberStyles.Any è più permissivo (accetta spazi, segno, notazione con parentesi per negativi, ecc.) — utile perché SAP a volte restituisce valori con spazi iniziali/finali o piccole variazioni. Per essere più restrittivi si può usare NumberStyles.Float, che copre la maggior parte dei casi reali (numero + decimale + eventuale segno).
Helper riutilizzabile¶
private static bool TryGetInvariantDouble(string input, out double result)
{
return double.TryParse(input, NumberStyles.Any, CultureInfo.InvariantCulture, out result);
}
Uso:
Regola pratica¶
- Stringa che si prevede sempre valida (es. già verificato che non sia vuota) → si può usare
Parsedentro untry/catchse si preferisce gestire l'eccezione esplicitamente. - Input utente / campo potenzialmente vuoto o sporco (praticamente sempre, nei form SAP) → usare sempre
TryParse: più pulito, non costringe a gestire eccezioni per un caso "normale" come un campo vuoto.