Home > Software engineering >  Visual Studio compiler errors (can't use commas)
Visual Studio compiler errors (can't use commas)

Time:10-03

I'm having a problem with my Visual Studio with C#. I'm creating console applications using .NET 5.0 (current).

Whenever I compile my program and put in decimal numbers (example: 62.5 it saves it as 625). How do I fix this?

Here's the code I've been using (it also does not save the commas on every other program). This program chooses the biggest number of the 3 inputs

using System;

namespace OEFGREATEST
{
    class Program
    {
        static void Main(string[] args)
        {
            string input_1_b;
            string input_2_b;
            string input_3_b;

            decimal input_1;
            decimal input_2;
            decimal input_3;

            input_1_b = Console.ReadLine();
            input_2_b = Console.ReadLine();
            input_3_b = Console.ReadLine();

            input_1 = Convert.ToDecimal(input_1_b);
            input_2 = Convert.ToDecimal(input_2_b);
            input_3 = Convert.ToDecimal(input_3_b);
            decimal output_1 = Math.Max(input_1, input_2);
            decimal output_2 = Math.Max(output_1, input_3);

            Console.WriteLine(output_2);
        }
    }
}

I've been using an online compiler while using the exact same program and it saves decimal numbers as normal (ex. 62.5 saves as 62.5)

Here are pictures of the compilers:

The online compiler (works fine)

Compiler Visual Studio (does not work fine)

Does anyone know how I can fix this? I've already reinstalled Visual Studio but it didn't fix it.

CodePudding user response:

The problem is that your PC has a language/culture (locale) setting that uses the dot (.) as a digit separator rather than as a decimal point (and, presumably, a comma for the decimal point). That is, 1 million would be written as 1.000.000 and (an approximation to) π would be 3,14159. In such a culture, the input dots are, effectively, ignored, so 62.3 is read as 623.

I'm not sure exactly what you mean by "can't use commas" (otherwise, entering 62,3 and 15,1 for the non-integral input values should work); however, you can fix the issue in two ways:

  1. Change the language/region settings of your computer; if you're on Windows 10, it's from "Control Panel" -> "Clock and Region" – and select a language that uses the 'expected' decimal point (like English).

  2. You can change the locale programmatically. Create a culture that uses the dot for the decimal point (like "en-US") and pass that as a second argument to the ToDecimal calls. Here's a modified version of your code that does that:

using System;
using System.Globalization; // For the CultureInfo class

namespace OEFGREATEST
{
    class Program
    {
        static void Main(string[] args)
        {
            string input_1_b;
            string input_2_b;
            string input_3_b;

            decimal input_1;
            decimal input_2;
            decimal input_3;

            input_1_b = Console.ReadLine();
            input_2_b = Console.ReadLine();
            input_3_b = Console.ReadLine();

            // Create an English/US culture and pass that to the ToDecimal calls ...
            CultureInfo CI = new CultureInfo("en-US", false);
            input_1 = Convert.ToDecimal(input_1_b, CI);
            input_2 = Convert.ToDecimal(input_2_b, CI);
            input_3 = Convert.ToDecimal(input_3_b, CI);
            decimal output_1 = Math.Max(input_1, input_2);
            decimal output_2 = Math.Max(output_1, input_3);

            Console.WriteLine(output_2);

        }
    }
}

Note that the above, as it stands, won't change the locale used for any output value; thus, if your largest input is 456.7, it will be displayed as 456,7 (using the system default locale). You can change this by adding a line like the following, before performing any output (using the same CultureInfo object, CI):

Thread.CurrentThread.CurrentCulture = CI; // Use this line to change the UI locale

(To use the above code, you will also need to add a using System.Threading; line near the top of your source file.)

  • Related