Проблема преобразования десятичного числа в строку в C # .Net - PullRequest
4 голосов
/ 16 июня 2011

При преобразовании десятичной дроби в строковую, я попробовал два метода.

Метод 1:

    string a = "100.00", b = "50.00";
    string Total = (string)(Convert.ToDecimal(a) + Convert.ToDecimal(b));

Выдает ошибку, не может преобразовать десятичную в строку.

Метод 2:

    string Total = (Convert.ToDecimal(a) + Convert.ToDecimal(b)).ToString();

Не выдает ошибку и работает нормально.

Я хочу знать разницу между этими двумя методами преобразования и почему он выдает ошибку, когда я использовал метод 1?

Ответы [ 6 ]

9 голосов
/ 16 июня 2011

Первый метод пытается взять десятичную дробь (результат добавления 2-х десятичных дробей) и привести ее как строку. Так как нет явного (неявного или) явного преобразования из десятичного в строковое, оно выбрасывается из-за несоответствия.

Второй принимает десятичное число и вызывает для него метод ToString () - поскольку ToString является допустимым методом для десятичного типа, это вызывает обычный вызов метода экземпляра, и вы получаете возвращаемое значение этого вызова, которое является строка.

Поскольку вы уже используете вызовы Convert, вы можете найти более естественным сделать Convert.ToString, чтобы вернуть десятичную строку обратно в строку.

Возможно, будет более понятно, если вы разделите 'добавить два знака после запятой' к отдельной локальной переменной, так как здесь это общее для обоих.

Итак, (закомментировано) total1 завершается ошибкой, потому что он пытается просто разыграть, и у нас нет доступных для этого преобразований. Последние два работают нормально, так как они являются вызовами методов, которые возвращают строку.

string a = "100.00", b = "50.00";
decimal result = Convert.ToDecimal(a) + Convert.ToDecimal(b);
//string total1 = (string)result;
string total2 = result.ToString();
string total3 = Convert.ToString(result);
1 голос
/ 16 июня 2011

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

Таблица явных числовых преобразований (C # Reference)

Второй метод работает, потому что вы используете метод ToString () класса объекта.

1 голос
/ 16 июня 2011

потому что в первом методе вы конвертировали строки a и b в десятичную, но в то время как вы просто вводите тип string в строку, вам нужно преобразовать это десятичное значение в строку, прежде чем присваивать его строковой переменной. во втором методе вы фактически конвертируете десятичное значение в строку, используя метод ToString(), поэтому ошибка не выдается.

1 голос
/ 16 июня 2011

Метод1 является приведением, поэтому вы пытаетесь «прочитать» данные, содержащиеся в десятичной переменной, в виде строки ... конечно, вы не можете. Вы можете, например, привести к байту int, потому что они оба числа. Вместо десятичного числа в строку вам нужна явная процедура преобразования.

1 голос
/ 16 июня 2011

Первый код пытается «набрать» приведение десятичного числа к строковому, в то время как второй вызывает метод ToString для десятичного числа, чтобы получить строковое представление десятичного числа. Преобразование типов из десятичного в строковое не будет работать, если только десятичный тип не перегружает оператор преобразования типов, что не происходит, и, следовательно, приведение типов приводит к исключению.

Приведение типов в этом случае похоже на запрос системы CLR о приведении приведения типа к десятичной дроби в строку, что CLR не может сделать, потому что не находит способ сделать это. Вызов ToString требует, чтобы десятичный тип возвращал свое строковое представление

1 голос
/ 16 июня 2011

В первом методе вы в основном делаете

string a = (string)150m;

, где 150 - десятичное число.Не существует явного или неявного приведения из десятичного числа в строковое.Компилятор не поймет, как выполнить преобразование.

Во втором методе вы вызываете

string a = 150m.ToString();

В этом случае вы вызываете метод ToString, который реализует класс Decimal (наряду свсе остальные классы).

...