Todouble c что это
Все примитивные типы имеют два метода, которые позволяют преобразовать строку к данному типу. Это методы Parse() и TryParse() .
Метод Parse() в качестве параметра принимает строку и возвращает объект текущего типа. Например:
int a = int.Parse("10"); double b = double.Parse("23,56"); decimal c = decimal.Parse("12,45"); byte d = byte.Parse("4"); Console.WriteLine($"a= b= c= d=");
Стоит отметить, что парсинг дробных чисел зависит от настроек текущей культуры. В частности, для получения числа double я передаю строку «23,56» с запятой в качестве разделителя. Если бы я передал точку вместо запятой, то приложение выдало ошибку выполнения. На компьютерах с другой локалью, наоборот, использование запятой вместо точки выдало бы ошибку.
Чтобы не зависеть от культурных различий мы можем установить четкий формат с помощью класса NumberFormatInfo и его свойства NumberDecimalSeparator :
using System.Globalization; IFormatProvider formatter = new NumberFormatInfo < NumberDecimalSeparator = "." >; double number = double.Parse("23.56", formatter); Console.WriteLine(number); // 23,56
В данном случае в качестве разделителя устанавливается точка. Однако тем не менее потенциально при использовании метода Parse мы можем столкнуться с ошибкой, например, при передачи алфавитных символов вместо числовых. И в этом случае более удачным выбором будет применение метода TryParse() . Он пытается преобразовать строку к типу и, если преобразование прошло успешно, то возвращает true . Иначе возвращается false:
Console.WriteLine("Введите строку:"); string? input = Console.ReadLine(); bool result = int.TryParse(input, out var number); if (result == true) Console.WriteLine($"Преобразование прошло успешно. Число: "); else Console.WriteLine("Преобразование завершилось неудачно");
Если преобразование пройдет неудачно, то исключения никакого не будет выброшено, просто метод TryParse возвратит false, а переменная number будет содержать значение по умолчанию.
Convert
Класс Convert представляет еще один способ для преобразования значений. Для этого в нем определены следующие статические методы:
- ToBoolean(value)
- ToByte(value)
- ToChar(value)
- ToDateTime(value)
- ToDecimal(value)
- ToDouble(value)
- ToInt16(value)
- ToInt32(value)
- ToInt64(value)
- ToSByte(value)
- ToSingle(value)
- ToUInt16(value)
- ToUInt32(value)
- ToUInt64(value)
В качестве параметра в эти методы может передаваться значение различных примитивных типов, необязательно строки:
int n = Convert.ToInt32("23"); bool b = true; double d = Convert.ToDouble(b); Console.WriteLine($"n= d=");
Однако опять же, как и в случае с методом Parse, если методу не удастся преобразовать значение к нужному типу, то он выбрасывает исключение FormatException.
Decimal. To Double(Decimal) Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Преобразует значение заданного значения типа Decimal в эквивалентное число двойной точности с плавающей запятой.
public: static double ToDouble(System::Decimal d);
public static double ToDouble (decimal d);
static member ToDouble : decimal -> double
Public Shared Function ToDouble (d As Decimal) As Double
Параметры
Десятичное число для преобразования.
Возвращаемое значение
Число с плавающей запятой двойной точности, эквивалентное значению d .
Примеры
В следующем примере кода числа преобразуются Decimal в Double значения с помощью ToDouble метода.
// Example of the Decimal::ToSingle and Decimal::ToDouble methods. using namespace System; #define formatter "" // Convert the Decimal argument; no exceptions are thrown. void DecimalToSgl_Dbl( Decimal argument ) < Object^ SingleValue; Object^ DoubleValue; // Convert the argument to a float value. SingleValue = Decimal::ToSingle( argument ); // Convert the argument to a double value. DoubleValue = Decimal::ToDouble( argument ); Console::WriteLine( formatter, argument, SingleValue, DoubleValue ); >int main() < Console::WriteLine( "This example of the \n" " Decimal::ToSingle( Decimal ) and \n" " Decimal::ToDouble( Decimal ) \nmethods " "generates the following output. It \ndisplays " "several converted Decimal values.\n" ); Console::WriteLine( formatter, "Decimal argument", "float", "double" ); Console::WriteLine( formatter, "----------------", "-----", "------" ); // Convert Decimal values and display the results. DecimalToSgl_Dbl( Decimal::Parse( "0.0000000000000000000000000001" ) ); DecimalToSgl_Dbl( Decimal::Parse( "0.0000000000123456789123456789" ) ); DecimalToSgl_Dbl( Decimal::Parse( "123" ) ); DecimalToSgl_Dbl( Decimal(123000000,0,0,false,6) ); DecimalToSgl_Dbl( Decimal::Parse( "123456789.123456789" ) ); DecimalToSgl_Dbl( Decimal::Parse( "123456789123456789123456789" ) ); DecimalToSgl_Dbl( Decimal::MinValue ); DecimalToSgl_Dbl( Decimal::MaxValue ); >/* This example of the Decimal::ToSingle( Decimal ) and Decimal::ToDouble( Decimal ) methods generates the following output. It displays several converted Decimal values. Decimal argument float double ---------------- ----- ------ 0.0000000000000000000000000001 1E-28 1E-28 0.0000000000123456789123456789 1.234568E-11 1.23456789123457E-11 123 123 123 123.000000 123 123 123456789.123456789 1.234568E+08 123456789.123457 123456789123456789123456789 1.234568E+26 1.23456789123457E+26 -79228162514264337593543950335 -7.922816E+28 -7.92281625142643E+28 79228162514264337593543950335 7.922816E+28 7.92281625142643E+28 */
// Example of the decimal.ToSingle and decimal.ToDouble methods. using System; class DecimalToSgl_DblDemo < static string formatter = ""; // Convert the decimal argument; no exceptions are thrown. public static void DecimalToSgl_Dbl( decimal argument ) < object SingleValue; object DoubleValue; // Convert the argument to a float value. SingleValue = decimal.ToSingle( argument ); // Convert the argument to a double value. DoubleValue = decimal.ToDouble( argument ); Console.WriteLine( formatter, argument, SingleValue, DoubleValue ); >public static void Main( ) < Console.WriteLine( "This example of the \n" + " decimal.ToSingle( decimal ) and \n" + " decimal.ToDouble( decimal ) \nmethods " + "generates the following output. It \ndisplays " + "several converted decimal values.\n" ); Console.WriteLine( formatter, "decimal argument", "float", "double" ); Console.WriteLine( formatter, "----------------", "-----", "------" ); // Convert decimal values and display the results. DecimalToSgl_Dbl( 0.0000000000000000000000000001M ); DecimalToSgl_Dbl( 0.0000000000123456789123456789M ); DecimalToSgl_Dbl( 123M ); DecimalToSgl_Dbl( new decimal( 123000000, 0, 0, false, 6 ) ); DecimalToSgl_Dbl( 123456789.123456789M ); DecimalToSgl_Dbl( 123456789123456789123456789M ); DecimalToSgl_Dbl( decimal.MinValue ); DecimalToSgl_Dbl( decimal.MaxValue ); >> /* This example of the decimal.ToSingle( decimal ) and decimal.ToDouble( decimal ) methods generates the following output. It displays several converted decimal values. decimal argument float double ---------------- ----- ------ 0.0000000000000000000000000001 1E-28 1E-28 0.0000000000123456789123456789 1.234568E-11 1.23456789123457E-11 123 123 123 123.000000 123 123 123456789.123456789 1.234568E+08 123456789.123457 123456789123456789123456789 1.234568E+26 1.23456789123457E+26 -79228162514264337593543950335 -7.922816E+28 -7.92281625142643E+28 79228162514264337593543950335 7.922816E+28 7.92281625142643E+28 */
' Example of the Decimal.ToSingle and Decimal.ToDouble methods. Module DecimalToSgl_DblDemo Dim formatter As String = "" ' Convert the Decimal argument; no exceptions are thrown. Sub DecimalToSgl_Dbl( argument As Decimal ) Dim SingleValue As Object Dim DoubleValue As Object ' Convert the argument to a Single value. SingleValue = Decimal.ToSingle( argument ) ' Convert the argument to a Double value. DoubleValue = Decimal.ToDouble( argument ) Console.WriteLine( formatter, argument, _ SingleValue, DoubleValue ) End Sub Sub Main( ) Console.WriteLine( "This example of the " & vbCrLf & _ " Decimal.ToSingle( Decimal ) and " & vbCrLf & _ " Decimal.ToDouble( Decimal ) " & vbCrLf & "methods " & _ "generates the following output. It " & vbCrLf & _ "displays several converted Decimal values." & vbCrLf ) Console.WriteLine( formatter, "Decimal argument", _ "Single", "Double" ) Console.WriteLine( formatter, "----------------", _ "------", "------" ) ' Convert Decimal values and display the results. DecimalToSgl_Dbl( 0.0000000000000000000000000001D ) DecimalToSgl_Dbl( 0.0000000000112233445566778899D ) DecimalToSgl_Dbl( 123D ) DecimalToSgl_Dbl( New Decimal( 123000000, 0, 0, False, 6 ) ) DecimalToSgl_Dbl( 123456789.123456789D ) DecimalToSgl_Dbl( 123456789123456789123456789D ) DecimalToSgl_Dbl( Decimal.MinValue ) DecimalToSgl_Dbl( Decimal.MaxValue ) End Sub End Module ' This example of the ' Decimal.ToSingle( Decimal ) and ' Decimal.ToDouble( Decimal ) ' methods generates the following output. It ' displays several converted Decimal values. ' ' Decimal argument Single Double ' ---------------- ------ ------ ' 0.0000000000000000000000000001 1E-28 1E-28 ' 0.0000000000112233445566778899 1.122334E-11 1.12233445566779E-11 ' 123 123 123 ' 123.000000 123 123 ' 123456789.123456789 1.234568E+08 123456789.123457 ' 123456789123456789123456789 1.234568E+26 1.23456789123457E+26 ' -79228162514264337593543950335 -7.922816E+28 -7.92281625142643E+28 ' 79228162514264337593543950335 7.922816E+28 7.92281625142643E+28
Комментарии
Эта операция может привести к ошибкам округления, так как число с плавающей запятой двойной точности содержит меньше значащих цифр, чем Decimal .
Также можно преобразовать Decimal в Double значение с помощью Explicit оператора присваивания. Поскольку преобразование может привести к утрате точности, необходимо использовать оператор приведения в C# или функцию преобразования в Visual Basic.
Как работать с числами с плавающей запятой в С#?
Unhandled Exception: System.FormatException: Input string was not in a correct format.
at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
at modConvertUSDRU.Program.ConverUSDRU() in D:\MailCloud\C#\CS2017WORK\modConvertUSDRU\Program.cs:line 32
at modConvertUSDRU.Program.Main(String[] args) in D:\MailCloud\C#\CS2017WORK\modConvertUSDRU\Program.cs:line 20*
Я понимаю что конфликт может быть в каком-то исключении или дело в конфликте (string/double) предположения есть, но где ошибка понять не могу!
Отслеживать
13.8k 12 12 золотых знаков 44 44 серебряных знака 77 77 бронзовых знаков
задан 28 мар 2018 в 4:22
199 17 17 бронзовых знаков
Switch работает с целыми числами.
28 мар 2018 в 4:32
Проблема в том, что в одной стране принято писать числа с точной, а в другой с запятой. C# это тоже учитывает и он не засунет значение с точкой к примеру в es культуру, либо значение с запятой в en культуру.
28 мар 2018 в 4:49
Ну я попробовал исключить Switch, но результат тот же! На точку выдаёт ошибку.
28 мар 2018 в 4:51
j. Atisto ошибка не самом switch. Просто надо запомнить, что работает с целыми числами.
28 мар 2018 в 4:53
Спасибо! Запомню! Ну так а, ошибка где!?
28 мар 2018 в 4:57
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Ваша проблема заключается в том, что определенные страны имеют свои стандарты. К примеру Америка, у них футы, мили и прочие для нас неведомые показатели. У нас принято все считать в метрах, километрах и других стандартных для нас величин.
Как не странно, но и принятые стандарты в написание чисел тоже у многих стран разные. Где то принято разделять число запятой (123,456), а где то для этого используется точка (123.456). Язык C# в этом плане тоже еще тот любитель все сверять с культурой и в связи с этим, он не даст вам перевести значение с точкой к примеру с ES культурой (ну или с EN культурой не удастся перевести значение с запятой.).
Пару примеров:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en"); Console.WriteLine(double.Parse("123.456")); Console.WriteLine(double.Parse("123,456"));
Значение с точкой отобразилось правильно, а вот значение с запятой саму , попросту откинул и выдал 123456 .
Thread.CurrentThread.CurrentCulture = new CultureInfo("es"); Console.WriteLine(double.Parse("123.456")); Console.WriteLine(double.Parse("123,456"));
Тут у нас значение с точкой — саму точку теряет (123456), а значение с запятой отображается как надо.
Thread.CurrentThread.CurrentCulture = new CultureInfo("ru"); Console.WriteLine(double.Parse("123.456")); Console.WriteLine(double.Parse("123,456"));
А в этом варианте мы получим ошибку System.FormatException: «Входная строка имела неверный формат.» (на строке с точкой), ибо русская культура не воспринимает точку.
Так как быть в таком случае, если надо и то и то значение вытащить?
-
Можем указать культуру явно:
CultureInfo culture = new CultureInfo("en"); Console.WriteLine(double.Parse("123.456", culture));
Thread.CurrentThread.CurrentCulture = new CultureInfo("ru"); Console.WriteLine(double.Parse("123.456".Replace(".", ","))); Console.WriteLine(double.Parse("123,456"));
public static double GetDouble(string value, double defaultValue) < //Пробуем получить значение в текущей культуре if (!double.TryParse(value, NumberStyles.Any, CultureInfo.CurrentCulture, out var result) && //Пробуем получить в en культуре !double.TryParse(value, NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out result) && //Пробуем получить в нейтральной культуре !double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out result)) < result = defaultValue; //Значение, если нечего не вышло >return result; >
var clone = (CultureInfo)CultureInfo.InvariantCulture.Clone(); clone.NumberFormat.NumberDecimalSeparator = "."; Console.WriteLine(double.Parse("123.456", clone)); Console.WriteLine(double.Parse("123,456")); //Или NumberFormatInfo format = new NumberFormatInfo ; Console.WriteLine(double.Parse("123.456", format)); Console.WriteLine(double.Parse("123,456"));
В общем, пробуйте. Удачи!
toDouble()
Converts a valid String to a double. The input String should start with a digit. If the String contains non-digit characters, the function will stop performing the conversion. For example, the Strings «123.45», «123», and «123fish» are converted to 123.45, 123.00, and 123.00 respectively. Note that «123.456» is approximated with 123.46. Note too that floats have only 6-7 decimal digits of precision and that longer Strings might be truncated.
Syntax
Parameters
myString : a variable of type String .
Returns
If no valid conversion could be performed because the String doesn’t start with a digit, a zero is returned. Data type: double .
See also
- EXAMPLE String Tutorials