Convert.ToDecimal не конвертирует входное десятичное число - PullRequest
3 голосов
/ 28 января 2020

Я новичок в c# и попытался преобразовать ввод в десятичное и двойное. Он работает нормально, когда я вхожу в Intiger, но останавливается сразу же, когда я ввожу десятичное или двойное число, и выдает мне сообщение об ошибке «Exception Unhandeled».

Мой код:

Console.Write("Enter number: ");
decimal d = Convert.ToDecimal(Console.ReadLine());

Console.WriteLine(d);

Поэтому, когда я ввожу 3, программа печатает число 3. Но если я ввожу 3,6, он останавливается.

Я видел другое решение, использующее Double.Parse (); но все еще не могу заставить мой код работать.

Console.Write("Enter number: ");
decimal d = Decimal.Parse(Console.ReadLine());

Console.WriteLine(d);

В моих кодах я использую десятичную дробь, но то же самое относится и к double.

Я пытался найти другие вопросы, такие как это (stackoveflow, Google), я проверил документацию, но не смог найти проблему. Что не так с моим кодом?

Ответы [ 3 ]

3 голосов
/ 28 января 2020

Все операции преобразования строк используют текущую культуру, которая может различаться в таких вещах, как десятичный разделитель или разделитель тысяч и другие. Вы можете указать инвариантную культуру в любом из следующих преобразований:

decimal d = Convert.ToDecimal(Console.ReadLine(), CultureInfo.InvariantCulture);
decimal d = Decimal.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);

Другой вариант - установить стандартную культуру в начале вашего приложения, что повлияет на все будущие преобразования:

CultureInfo.CurrentCulture = CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
2 голосов
/ 28 января 2020

Хорошо, если вы используете decimal для финансы , вы можете принять не только десятичный разделитель, но групповой (тысяча) один:

   123,456,789.45

здесь . - это разделитель десятичный , когда , - групповые. Для поддержки разделителя групп вы можете указать NumberStyles.Any

   Console.Write("Enter number: ");

   decimal d;

   while (!Decimal.TryParse(Console.ReadLine(), NumberStyles.Any, null, out d)) 
     Console.WriteLine("Invalid syntax. Please, try again."); 

Обратите внимание, что здесь я поместил null, что означает CultureInfo.CurrentCulture, которое на вашей рабочей станции, кажется, имеет , для десятичного разделителя и . для первой группы:

   "123.45"    -> 12345m   - note, that group separator(s) is/are removed
   "1.2.3.4.5" -> 12345m
   "123,45"    -> 123.45m  - while decimal is turned into decimal point  

Если вы хотите обработать . как десятичный разделитель (поэтому "123.45" будет проанализирован в 123.45m), вы можете указать CultureInfo.InvariantCulture:

   Console.Write("Enter number: ");

   decimal d;

   while (!Decimal.TryParse(Console.ReadLine(), 
                            NumberStyles.Any, 
                            CultureInfo.InvariantCulture, 
                            out d)) 
     Console.WriteLine("Invalid syntax. Please, try again."); 
0 голосов
/ 28 января 2020

Как отмечалось в комментариях, десятичный разделитель варьируется от страны к стране. Я бы предложил вручную заменить введенный символ на разделитель, используемый в вашей культуре:

string separator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
decimal d = Decimal.Parse(Console.ReadLine().Replace(".", separator).Replace(",", separator));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...