Задать вопрос
@Newbie2

Почему в консоли не отображается ноль при значении переменной double менее 1?

Приветствую всех!

Есть вот такой код:

namespace ConsoleApp13
{
    class Program
    {
        static void Main(string[] args)
        {
            double i;
            i = 0.5;
            Console.WriteLine("i равно {0}", i);
        }
    }
}

При запуске программы в консоль выводится число 0.5

А вот в коде ниже, вместо "0.5" выводится ".5". Ноль не отображается. Как это можно поправить?

namespace Technocalc
{
    class Technocalc
    {
        public double S, diameter, L, U, I, R, P, padU;
                
        public double CableResist(double S, double L)
        {
            // public double rConst = 0.018;
            return 0.018/S*L*2;
        }

        public double pad_U (double R, double I, double L)
        {
            return (R * I);
        }
        
    class Calculate
        {

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Technocalc cable = new Technocalc();
            Console.WriteLine("\t\t\t\t" + "Программа расчета падения напряжения в кабеле. 2019 г. Версия 0.0.1");
            bool t;
            t = false;
            while (t == false)
            {
                try
                {
                Console.Write("Введи сечение кабеля, мм2: ");
                    cable.S = Convert.ToDouble(Console.ReadLine());
                    t = true;
                }
            catch (System.FormatException)
                {
                    Console.WriteLine("Ошибка! Разделителем должна быть запятая.");
                }
            }
            t = false;
            while (t == false)
            {
                try
                {
                    Console.Write("Введи длину кабеля, м: ");
                    cable.L = Convert.ToDouble(Console.ReadLine());
                    t = true;
                }
                catch (System.FormatException)
                {
                    Console.WriteLine("Ошибка! Разделителем должна быть запятая.");
                }
            }
            t = false;
            while (t == false)
            {
                try
                {
                    Console.Write("Введи нагрузку на конце линии, А: ");
            cable.I = Convert.ToDouble(Console.ReadLine());
                    t = true;
                }
                catch (System.FormatException)
                {
                    Console.WriteLine("Ошибка! Разделителем должна быть запятая.");
                }
            }
            t = false;
            while (t == false)
            {
                try
                {
                    Console.Write("Введи значение напряжения источника, В: ");
            cable.U = Convert.ToDouble(Console.ReadLine());
                    t = true;
                }
                catch (System.FormatException)
                {
                    Console.WriteLine("Ошибка! Разделителем должна быть запятая.");
                }
            }
            cable.R = cable.CableResist(cable.S, cable.L);
            cable.padU = cable.pad_U(cable.R, cable.I, cable.L);
            cable.diameter = (3.1415926535 * cable.S * cable.S) / 4;

           
            //вывод всей информации на экран
            Console.WriteLine();
            Console.WriteLine("\t\t\t\t"+"Параметры линии:");
            Console.WriteLine("--------------------------------------------------------------------------------");
            Console.WriteLine("Кол-во жил\t\tRкабеля, Ом\t\tСечение, мм2\t\tНапряжение,В\tВых. напряжение, В");
            Console.WriteLine("{0:#.##}\t\t\t{1:#.##}\t\t\t{2:#.##}\t\t\t{3:#.##}\t\t{4:#.##}", 2, cable.R, cable.S, cable.U, cable.U - cable.padU);
            Console.WriteLine("--------------------------------------------------------------------------------");
            Console.WriteLine("Rжилы , Ом\t\tДлина кабеля,м\t\tНагрузка, А\t\tПадение U, В\tДиаметр жилы, мм");
            Console.WriteLine("{0:##.##}\t\t\t{1:##.##}\t\t\t{2:##.##}\t\t\t{3:#.##}\t\t{4:#.##}\t\t", cable.CableResist(cable.S, cable.L)/2, cable.L, cable.I, cable.padU, cable.diameter);
            Console.WriteLine();
            Console.ReadKey();
        }
    }
}
  • Вопрос задан
  • 402 просмотра
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
FoggyFinder
@FoggyFinder
Символ "#" в форматированной строке не отображает "незначащие" нули.

В вашем случае, вероятно, подойдет спецификатор "0".

Подробнее о форматировании чисел можно прочесть, например, в специальном разделе документации:

Строки настраиваемых числовых форматов

Позволю себе оставить пару комментариев-советов по поводу кода. Хотел оформить в виде комментария, но в виду объема и того что по каким-то причинам не подсвечивался синтаксис переношу сюда:

1. Как вы должно быть заметили некоторая функциональность при считывании информации с консоли дублируется. Вместо того чтобы заниматься копированием однотипного участка внося минимальные изменения такие части удобнее выносить в отдельные функции.

Например:

public static double ReadDouble
    (string msg = "", string errMsg = "Произошла ошибка, повторите ввод")
{
    if (!string.IsNullOrWhiteSpace(msg))
        Console.WriteLine(msg);

    double value;
    while (!double.TryParse(Console.ReadLine(), out value))
        Console.WriteLine(errMsg);

    return value;
}


Тогда считывание будет намного понятнее:

var s = ReadDouble("Введи сечение кабеля, мм2: ");
var l = ReadDouble("Введи длину кабеля, мм2: ");
var i = ReadDouble("Введи нагрузку на конце линии, А: ");
var u = ReadDouble("Введи значение напряжения источника, В: ");


2. По возможности следует избегать использования "магических чисел" (как у вас - 0.018). Константы должны быть определены как константы. Вместо определения Pi как 3.1415926535 используете встроенное Math.PI.

3. Использование полей в классе можно улучшить. Сейчас они у вас открытые и задаются извне. Если какие параметры являются обязательными, то определив соответствующий конструктор, можно не только добавить сделать класс более надежным, но и в дальнейшем сделать проверку на правильность передаваемых значений.

public double S { get; set; }
public double L { get; set; }
public double I { get; set; }
public double U { get; set; }

public Technocalc(double s, double l, double i, double u)
{
    S = s;
    L = l;
    I = i;
    U = u;
}


4. Методы можно упростить с более современным синтаксисом:

public double padU => R * I;
public double R => RConst / S * L * 2;
public double diameter => Math.PI * S * S / 4;


Итого, с учетом написанного выше класс будет выглядеть вот так:

class Technocalc
    {
        public const double RConst = 0.018;

        public double S { get; set; }
        public double L { get; set; }
        public double I { get; set; }
        public double U { get; set; }

        public Technocalc(double s, double l, double i, double u)
        {
            S = s;
            L = l;
            I = i;
            U = u;
        }

        public double padU => R * I;
        public double R => RConst / S * L * 2;
        public double diameter => Math.PI * S * S / 4;
    }



и вызывающий код:

public static double ReadDouble
            (string msg = "", string errMsg = "Произошла ошибка, повторите ввод")
        {
            if (!string.IsNullOrWhiteSpace(msg))
                Console.WriteLine(msg);

            double value;
            while (!double.TryParse(Console.ReadLine(), out value))
                Console.WriteLine(errMsg);

            return value;
        }
        public static void Main(string[] args)
        {
            Console.WriteLine("\t\t\t\t" + "Программа расчета падения напряжения в кабеле. 2019 г. Версия 0.0.1");
            var s = ReadDouble("Введи сечение кабеля, мм2: ");
            var l = ReadDouble("Введи длину кабеля, мм2: ");
            var i = ReadDouble("Введи нагрузку на конце линии, А: ");
            var u = ReadDouble("Введи значение напряжения источника, В: ");
            Technocalc cable = new Technocalc(s, l, i, u);

            //вывод всей информации на экран
            Console.WriteLine();
            Console.WriteLine("\t\t\t\t" + "Параметры линии:");
            Console.WriteLine("--------------------------------------------------------------------------------");
            Console.WriteLine("Кол-во жил\t\tRкабеля, Ом\t\tСечение, мм2\t\tНапряжение,В\tВых. напряжение, В");
            Console.WriteLine("{0:#0.##}\t\t\t{1:0.0#}\t\t\t{2:0.##}\t\t\t{3:0.##}\t\t{4:0.##}", 2, cable.R, cable.S, cable.U, cable.U - cable.padU);
            Console.WriteLine("--------------------------------------------------------------------------------");
            Console.WriteLine("Rжилы , Ом\t\tДлина кабеля,м\t\tНагрузка, А\t\tПадение U, В\tДиаметр жилы, мм");
            Console.WriteLine("{0:#0.##}\t\t\t{1:#0.##}\t\t\t{2:#0.##}\t\t\t{3:#0.##}\t\t{4:#0.##}\t\t", cable.R / 2, cable.L, cable.I, cable.padU, cable.diameter);
            Console.WriteLine();
            Console.ReadKey(true);
        }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы