Un certo numero (decimal
in questo caso) non è lo stesso della sua rappresentazione di stringa (come valuta in questo caso). Ecco perché devi prima analizzare l'input da un punto di vista della stringa (il formato è soddisfatto?) E poi da uno numerico. Ci sono alcuni modi per eseguire l'analisi in una volta sola (come proposto in altre risposte), sebbene non forniscano la determinazione che si sta cercando (vale a dire, è una valuta o no, intesa come i meri numeri sono sbagliati).
codice di esempio:
private void btn_Click(object sender, EventArgs e)
{
//Note: ideally, curCulture shouldn't be defined here (but globally or
//passed as argument), but otherwise my code would be somehow incomplete.
CultureInfo curCulture = new CultureInfo("en-US", true);
bool isOK = false;
string[] temp = totalTextBox.Text.Trim().Split(new string[] { curCulture.NumberFormat.CurrencySymbol }, StringSplitOptions.None);
if (temp.Length == 2 && temp[0].Trim().Length == 0)
{
decimal outVal = 0m;
if (decimal.TryParse(temp[1], out outVal)) isOK = true;
}
MessageBox.Show(isOK ? "currency format" : "error wrong format");
}
nota un paio di cose:
curCulture
si prevede di tenere il formato desiderato (si potrebbe anche conto per le diverse culture/valute/formati). Dal tuo esempio, sembra che tu voglia : CultureInfo curCulture = new CultureInfo("en-US", true);
.
- L'analisi della stringa di input può essere complessa come richiesto. Ad esempio: nel codice postato, mi sto anche assicurando che il simbolo della valuta si trovi nella prima posizione.
---- UPDATE (che rappresentano problemi di analisi decimali con separatori di migliaia)
Dopo aver confermato che le proposte Decimal.TryParse
(e altri approcci equivalenti) non fornire ciò che ci si aspetta quando separatori di migliaia (gruppo separatori), ho deciso di scrivere il codice qui sotto che si occupa di questo tipo di problemi. In ogni caso, tenete presente che non sono troppo esperto in queste situazioni (cioè, gestendo gli input decimali sbagliati tenendo conto di migliaia di separatori) ed è per questo che non sono sicuro se esistano modi più efficienti per affrontare questo problema (sebbene la proposta l'analisi è certamente veloce).
private void btn_Click(object sender, EventArgs e)
{
//Note: ideally, curCulture shouldn't be defined here (but globally or
//passed as argument), but otherwise my code would be somehow incomplete.
CultureInfo curCulture = new CultureInfo("en-US", true);
bool isOK = false;
string[] temp = totalTextBox.Text.Trim().Split(new string[] { curCulture.NumberFormat.CurrencySymbol }, StringSplitOptions.None);
if (temp.Length == 2 && temp[0].Trim().Length == 0)
{
isOK = isDecimalOK(temp[1], curCulture);
}
MessageBox.Show(isOK ? "currency format" : "error wrong format");
}
private bool isDecimalOK(string inputString, CultureInfo curCulture)
{
bool isOK = false;
string[] temp = inputString.Split(new string[] { curCulture.NumberFormat.CurrencyDecimalSeparator }, StringSplitOptions.None);
if (temp.Length > 2) return isOK;
int outVal0 = 0;
if (!int.TryParse(temp[0], NumberStyles.AllowThousands, curCulture, out outVal0)) return isOK;
else if (analyseThousands(temp[0], curCulture))
{
isOK = (temp.Length == 2 ? int.TryParse(temp[1], NumberStyles.Integer, curCulture, out outVal0) : true);
}
return isOK;
}
private bool analyseThousands(string intInput, CultureInfo curCulture)
{
string[] temp2 = intInput.Split(new string[] { curCulture.NumberFormat.CurrencyGroupSeparator }, StringSplitOptions.None);
if (temp2.Length >= 2)
{
if (temp2[0].Trim().Length == 0) return false;
else
{
for (int i2 = 1; i2 < temp2.Length; i2++)
{
if (!curCulture.NumberFormat.CurrencyGroupSizes.Contains(temp2[i2].Length)) return false;
}
}
}
return true;
}
Ciao grazie per aver spiegato. Questo codice mi dà una riga di errore rossa sotto {curCulture, come posso renderlo valido –
@LearningToCode Lo sto spiegando nei miei commenti sotto il codice: definiscilo come desideri.Certo che 'curCulture = new CultureInfo (" en-US ");' è ciò che sto cercando. Scrivi questa riga sopra bool isOK = false; modificherà subito la mia risposta per ogni evenienza. – varocarbas
Forse l'ho scritto male. Ecco come l'ho scritto :: {curCulture = new Cultur eInfo ("en-US"). NumberFormat.CurrencySymbol}, StringSplitOptions.None); –