Converti la stringa in decimale, mantenendo le frazioni

Sto cercando di convertire 1200.00 in decimal , ma Decimal.Parse() rimuove .00 . Ho provato alcuni metodi diversi, ma rimuove sempre .00 , tranne quando fornisco una frazione diversa da 0.

 string value = "1200.00"; 

Metodo 1

  var convertDecimal = Decimal.Parse(value , NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint | NumberStyles.AllowCurrencySymbol); 

Metodo 2

  var convertDecimal = Convert.ToDecimal(value); 

Metodo 3

 var convertDecimal = Decimal.Parse(value, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); 

Come posso convertire una string contenente 1200.00 in un decimal contenente 1200.00 ?

Hmm … Non riesco a riprodurre questo:

 using System; class Test { static void Main() { decimal d = decimal.Parse("1200.00"); Console.WriteLine(d); // Prints 1200.00 } } 

Sei sicuro che non sia un’altra parte del tuo codice che normalizza il valore decimale in seguito?

Nel caso si tratti di problemi culturali, prova questa versione che non dovrebbe dipendere affatto dalla tua locale:

 using System; using System.Globalization; class Test { static void Main() { decimal d = decimal.Parse("1200.00", CultureInfo.InvariantCulture); Console.WriteLine(d.ToString(CultureInfo.InvariantCulture)); } } 

Penso che il tuo problema sia quando visualizzi il decimale, non il suo contenuto.

Se provi

 string value = "1200.00"; decimal d = decimal.Parse(s); string s = d.ToString(); 

s conterrà la stringa "1200" .

Tuttavia se si modifica il codice a questo

 string value = "1200.00"; decimal d = decimal.Parse(s); string s = d.ToString("0.00"); 

s conterrà la stringa "1200.00" come vuoi che faccia.

MODIFICARE

Sembra che oggi sia un braindead presto al mattino. Ho aggiunto le istruzioni Parse ora. Tuttavia, anche il mio primo codice produrrà “1200.00”, anche se mi aspettavo che producesse “1200”. Sembra che sto imparando qualcosa ogni giorno, e in questo caso ovviamente qualcosa di abbastanza semplice.

Quindi ignorare questo una risposta adeguata. Probabilmente avremo bisogno di più codice per identificare il tuo problema in questo caso.

Ciao, avevo lo stesso problema, ma è facile, basta fare questo:

string cadena="96.23";

decimal NoDecimal=decimal.parse(cadena.replace(".",","))

Penso che questo sia dovuto alla notazione che accetta C # sui numeri decimali con un “,”

Il codice sottostante stampa il valore come 1200,00.

 var convertDecimal = Convert.ToDecimal("1200.00"); Console.WriteLine(convertDecimal); 

Non sei sicuro di cosa ti aspetti?

Usa questo esempio

 System.Globalization.CultureInfo culInfo = new System.Globalization.CultureInfo("en-GB",true); decimal currency_usd = decimal.Parse(GetRateFromCbrf("usd"),culInfo); decimal currency_eur = decimal.Parse(GetRateFromCbrf("eur"), culInfo); 

Ecco una soluzione che mi è venuta in mente. Questo è pronto per essere eseguito come un progetto prompt dei comandi. Hai bisogno di pulire alcune cose se non. Spero che questo ti aiuti. Accetta diversi formati di input come: 1.234.567,89 1.234.567,89 ecc

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Globalization; using System.Linq; namespace ConvertStringDecimal { class Program { static void Main(string[] args) { while(true) { // reads input number from keyboard string input = Console.ReadLine(); double result = 0; // remove empty spaces input = input.Replace(" ", ""); // checks if the string is empty if (string.IsNullOrEmpty(input) == false) { // check if input has , and . for thousands separator and decimal place if (input.Contains(",") && input.Contains(".")) { // find the decimal separator, might be , or . int decimalpos = input.LastIndexOf(',') > input.LastIndexOf('.') ? input.LastIndexOf(',') : input.LastIndexOf('.'); // uses | as a temporary decimal separator input = input.Substring(0, decimalpos) + "|" + input.Substring(decimalpos + 1); // formats the output removing the , and . and replacing the temporary | with . input = input.Replace(".", "").Replace(",", "").Replace("|", "."); } // replaces , with . if (input.Contains(",")) { input = input.Replace(',', '.'); } // checks if the input number has thousands separator and no decimal places if(input.Count(item => item == '.') > 1) { input = input.Replace(".", ""); } // tries to convert input to double if (double.TryParse(input, out result) == true) { result = Double.Parse(input, NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.InvariantCulture); } } // outputs the result Console.WriteLine(result.ToString()); Console.WriteLine("----------------"); } } } } 

Il valore è lo stesso anche se la rappresentazione stampata non è quella che ti aspetti:

 decimal d = (decimal )1200.00; Console.WriteLine(Decimal.Parse("1200") == d); //True 

Puoi provare a chiamare questo metodo nel tuo programma:

 static double string_double(string s) { double temp = 0; double dtemp = 0; int b = 0; for (int i = 0; i < s.Length; i++) { if (s[i] == '.') { i++; while (i < s.Length) { dtemp = (dtemp * 10) + (int)char.GetNumericValue(s[i]); i++; b++; } temp = temp + (dtemp * Math.Pow(10, -b)); return temp; } else { temp = (temp * 10) + (int)char.GetNumericValue(s[i]); } } return -1; //if somehow failed } 

Esempio:

 string s = "12.3"; double d = string_double (s); //d = 12.3 

decimal d = 3.00 è ancora 3. Immagino che tu voglia mostrarlo in qualche posto sullo schermo o stamparlo sul file di log come 3.00. Puoi fare seguendo

 string str = d.ToString("F2"); 

oppure se si utilizza il database per memorizzare il decimale, è ansible impostare il valore di pricision nel database.

L’uso della lezione CultureInfo ha funzionato per me, spero di aiutarti.

  string value = "1200.00"; CultureInfo culture = new CultureInfo("en-US"); decimal result = Convert.ToDecimal(value, culture); 

Questo è ciò che devi fare.

 decimal d = 1200.00; string value = d.ToString(CultureInfo.InvariantCulture); // value = "1200.00" 

Questo ha funzionato per me. Grazie.