Руководство по программированию на C#. Преобразование строки в число
Для преобразования string в число используется вызов метода Parse или TryParse , который можно найти в числовых типах ( int , long , double и т. д.), или используются методы в классе System.Convert.
Немного эффективнее и проще вызвать метод TryParse (например, int.TryParse(«11», out number) ) или метод Parse (например, var number = int.Parse(«11») ). Использование метода Convert более удобно для общих объектов, реализующих IConvertible.
Можно использовать методы Parse или TryParse в числовом типе, который предположительно содержит строка, таком как тип System.Int32. Метод Convert.ToInt32 использует Parse внутри себя. Метод Parse возвращает преобразованное число; метод TryParse возвращает логическое значение, которое указывает, успешно ли выполнено преобразование, и возвращает преобразованное число в параметр out . Если строка имеет недопустимый формат, Parse создает исключение, а TryParse возвращает значение false . В случае сбоя операции синтаксического анализа при вызове метода Parse вы всегда должны использовать обработку исключений, чтобы перехватить FormatException.
Вызов метода Parse или TryParse
Методы Parse и TryParse игнорируют пробелы в начале и в конце строки, но все остальные символы должны быть символами, которые образуют соответствующий числовой тип ( int , long , ulong , float , decimal и т. д.). Любые пробелы в строке, образующие число, приводят к ошибке. Например, можно использовать decimal.TryParse для анализа «10», «10.3» или » 10 «, но этот метод нельзя использовать для анализа 10 из «10X», «1 0» (обратите внимание на внедренный пробел), «10 .3» (обратите внимание на внедренный пробел), «10e1» (здесь работает float.TryParse ) и т. д. Строку со значением null или String.Empty невозможно успешно проанализировать. Вы можете проверить наличие NULL или пустой строки, прежде чем пытаться ее проанализировать, вызвав метод String.IsNullOrEmpty.
В указанном ниже примере демонстрируются успешные и неуспешные вызовы методов Parse и TryParse .
using System; public static class StringConversion < public static void Main() < string input = String.Empty; try < int result = Int32.Parse(input); Console.WriteLine(result); >catch (FormatException) < Console.WriteLine($"Unable to parse ''"); > // Output: Unable to parse '' try < int numVal = Int32.Parse("-105"); Console.WriteLine(numVal); >catch (FormatException e) < Console.WriteLine(e.Message); >// Output: -105 if (Int32.TryParse("-105", out int j)) < Console.WriteLine(j); >else < Console.WriteLine("String could not be parsed."); >// Output: -105 try < int m = Int32.Parse("abc"); >catch (FormatException e) < Console.WriteLine(e.Message); >// Output: Input string was not in a correct format. const string inputString = "abc"; if (Int32.TryParse(inputString, out int numValue)) < Console.WriteLine(numValue); >else < Console.WriteLine($"Int32.TryParse could not parse '' to an int."); > // Output: Int32.TryParse could not parse 'abc' to an int. > >
В следующем примере показан один из подходов к анализу строки, которая, как ожидается, будет включать начальные числовые символы (включая шестнадцатеричные символы) и конечные нечисловые символы. Он назначает допустимые символы в начале новой строки перед вызовом метода TryParse. Поскольку анализируемые строки содержат небольшое количество символов, в примере вызывается метод String.Concat для назначения допустимых символов новой строке. Для большей строки можете использовать класс StringBuilder.
using System; public static class StringConversion < public static void Main() < var str = " 10FFxxx"; string numericString = string.Empty; foreach (var c in str) < // Check for numeric characters (hex in this case) or leading or trailing spaces. if ((c >= '0' && c = 'A' && char.ToUpperInvariant(c) else < break; >> if (int.TryParse(numericString, System.Globalization.NumberStyles.HexNumber, null, out int i)) < Console.WriteLine($"'' --> '' --> "); > // Output: ' 10FFxxx' --> ' 10FF' --> 4351 str = " -10FFXXX"; numericString = ""; foreach (char c in str) < // Check for numeric characters (0-9), a negative sign, or leading or trailing spaces. if ((c >= '0' && c else < break; >> if (int.TryParse(numericString, out int j)) < Console.WriteLine($"'' --> '' --> "); > // Output: ' -10FFXXX' --> ' -10' --> -10 > >
Вызов методов класса Convert
В следующей таблице перечислены некоторые методы класса Convert, которые можно использовать для преобразования строки в число.
Числовой тип | Способ |
---|---|
decimal | ToDecimal(String) |
float | ToSingle(String) |
double | ToDouble(String) |
short | ToInt16(String) |
int | ToInt32(String) |
long | ToInt64(String) |
ushort | ToUInt16(String) |
uint | ToUInt32(String) |
ulong | ToUInt64(String) |
В следующем примере метод вызывает Convert.ToInt32(String) метод для преобразования входной строки в int. В примере перехватываются два наиболее распространенных исключения, создаваемых этим методом: FormatException и OverflowException. Если итоговое число можно увеличить, не превышая Int32.MaxValue, пример добавляет 1 к результату и отображает вывод.
using System; public class ConvertStringExample1 < static void Main(string[] args) < int numVal = -1; bool repeat = true; while (repeat) < Console.Write("Enter a number between −2,147,483,648 and +2,147,483,647 (inclusive): "); string? input = Console.ReadLine(); // ToInt32 can throw FormatException or OverflowException. try < numVal = Convert.ToInt32(input); if (numVal < Int32.MaxValue) < Console.WriteLine("The new value is ", ++numVal); > else < Console.WriteLine("numVal cannot be incremented beyond its current value"); >> catch (FormatException) < Console.WriteLine("Input string is not a sequence of digits."); >catch (OverflowException) < Console.WriteLine("The number cannot fit in an Int32."); >Console.Write("Go again? Y/N: "); string? go = Console.ReadLine(); if (go?.ToUpper() != "Y") < repeat = false; >> > > // Sample Output: // Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): 473 // The new value is 474 // Go again? Y/N: y // Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): 2147483647 // numVal cannot be incremented beyond its current value // Go again? Y/N: y // Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): -1000 // The new value is -999 // Go again? Y/N: n
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Встроенные числовые преобразования (справочник по C#)
C# предоставляет набор целочисленных типов и типы с плавающей запятой. Существует преобразование между любыми двумя числовыми типами: неявное или явное. Для выполнения явного преобразования необходимо использовать выражение приведения.
Неявные числовые преобразования
В следующей таблице приведены предопределенные неявные преобразования между встроенными числовыми типами:
С дт. | По |
---|---|
sbyte | short , int , long , float , double , decimal или nint |
byte | short , ushort , int , uint , long , ulong , float , double , decimal , nint или nuint |
short | int , long , float , double или decimal либо nint |
ushort | int , uint , long , ulong , float , double или decimal , nint или nuint |
int | long , float , double или decimal , nint |
uint | long , ulong , float , double или decimal либо nuint |
long | float , double или decimal |
ulong | float , double или decimal |
float | double |
nint | long , float , double или decimal |
nuint | ulong , float , double или decimal |
Неявные преобразования из int , uint , long , ulong , nint или nuint в float и из long , ulong , nint или nuint в double могут приводить к потере точности, но не к потере порядка величин. Другие неявные числовые преобразования никогда не теряют никаких сведений.
Также обратите внимание на следующее.
- Любой целочисленный тип неявно преобразуется в любой числовой тип с плавающей запятой.
- Не поддерживается неявное преобразование в типы byte и sbyte . Не поддерживается неявное преобразование из типов double и decimal .
- Не поддерживается неявное преобразование между типом decimal и типами float или double .
- Значение константного выражения типа int (например, значение, представленное целочисленным литералом) может быть неявно преобразовано в sbyte , byte , short , ushort , uint , ulong , nint или nuint , если оно находится в диапазоне целевого типа:
byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Явные числовые преобразования
В следующей таблице показаны предопределенные явные преобразования между встроенными числовыми типами, для которых нет неявного преобразования:
С дт. | По |
---|---|
sbyte | byte , ushort , uint , ulong или nuint |
byte | sbyte |
short | sbyte , byte , ushort , uint , ulong или nuint |
ushort | sbyte , byte или short |
int | sbyte , byte , short , ushort , uint , ulong или nuint |
uint | sbyte , byte , short , ushort , int или nint |
long | sbyte , byte , short , ushort , int , uint , ulong , nint или nuint |
ulong | sbyte , byte , short , ushort , int , uint , long , nint или nuint |
float | sbyte , byte , short , ushort , int , uint , long , ulong , decimal , nint или nuint |
double | sbyte , byte , short , ushort , int , uint , long , ulong , float , decimal , nint или nuint |
десятичное | sbyte , byte , short , ushort , int , uint , long , ulong , float , double , nint или nuint |
nint | sbyte , byte , short , ushort , int , uint , ulong или nuint |
nuint | sbyte , byte , short , ushort , int , uint , long или nint |
Явное числовое преобразование может привести к утрате данных или созданию исключения, обычно OverflowException.
Также обратите внимание на следующее:
- При преобразовании значения целочисленного типа в другой целочисленный тип результат зависит от контекста переполнения проверка. В проверенном контексте преобразование выполняется успешно, если исходное значение находится в диапазоне конечного типа. В противном случае возникает исключение OverflowException. В непроверяемом контексте преобразование всегда завершается успешно и выполняется следующим образом.
- Если исходный тип больше целевого, исходное значение усекается путем отбрасывания его «лишних» самых значимых битов. Результат затем обрабатывается как значение целевого типа.
- Если исходный тип меньше целевого, исходное значение дополняется знаками или нулями, чтобы иметь тот же размер, что и целевой тип. Знаки добавляются, если исходный тип имеет знак. Если у исходного типа нет знака, добавляются нули. Результат затем обрабатывается как значение целевого типа.
- Если исходный тип совпадает по размеру с целевым, исходное значение обрабатывается как значение целевого типа.
- Если исходное значение слишком мало для представления в виде decimal , результатом будет ноль.
- Если исходное значение не является числом (NaN), равно бесконечности или слишком велико для представления в виде decimal , возникает исключение OverflowException.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:
- Неявные числовые преобразования
- Явные числовые преобразования
См. также
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Преобразование типа данных double в тип данных int: как это сделать и зачем это нужно?
Одним из наиболее распространенных сценариев при программировании на Си является необходимость преобразования переменной типа double в переменную типа int. Возможны различные причины для выполнения такой операции, например, когда нужно отбросить дробную часть числа или когда требуется объединить результаты вычисления нескольких переменных.
Пример кода на Си, демонстрирующий преобразование переменной типа double в переменную типа int, может выглядеть следующим образом:
c double my_double = 3.14159; int my_int; my_int = (int) my_double; printf("Double value: %f, Int value: %d \n", my_double, my_int);
В данном примере мы объявляем переменную типа double и присваиваем ей значение константы Пи. Затем мы создаем переменную типа int и используем оператор приведения типов, чтобы сконвертировать значение переменной типа double в значение типа int. Конструкция (int) перед именем переменной типа double говорит компилятору о необходимости преобразования этого значения в целое число.
В результате мы получим целочисленное значение, которое не будет содержать дробной части, поскольку он была отброшена при преобразовании. Затем мы выводим значения на экран, чтобы убедиться, что преобразование было выполнено корректно.
Также следует учитывать, что при использовании оператора приведения типов, может произойти потеря информации, особенно при преобразовании больших значений типа double в тип int. Поэтому рекомендуется использовать другие методы, например, функцию номерное округление (round()), чтобы обеспечить более точное преобразование чисел с плавающей запятой в целочисленные значения.
c double my_double = 3.99; int my_int; my_int = round(my_double); printf("Double value: %f, Int value: %d \n", my_double, my_int);
В данном примере мы используем функцию округления (round()), которая позволяет нам сконвертировать значение переменной типа double в ближайшее целое число. Затем мы снова выводим значения на экран.
Таким образом, преобразование переменной типа double в переменную типа int в Си является простой операцией, но нужно учитывать возможность потери информации. Для более точного преобразования следует использовать дополнительные функции, такие как round().
Руководство по программированию на C#. Приведение и преобразование типов
Так как C# статически типируется во время компиляции, после объявления переменной его нельзя объявить еще раз или назначить значение другого типа, если этот тип неявно преобразуется в тип переменной. Например, string невозможно неявно преобразовать в int . Таким образом, после объявления i как не int удается назначить строку Hello, как показано в следующем коде:
int i; // error CS0029: can't implicitly convert type 'string' to 'int' i = "Hello";
Тем не менее иногда может потребоваться скопировать значение в переменную или параметр метода другого типа. Например, может потребоваться передать целочисленную переменную в метод, параметр которого имеет тип double . Или может понадобиться присвоить переменную класса переменной типа интерфейса. Такого рода операции называются преобразованиями типа. В C# можно выполнять следующие виды преобразований.
- Неявные преобразования: специальный синтаксис не требуется, так как преобразование всегда выполняется успешно, и данные не теряются. Примеры включают преобразования из меньших в большие целочисленные типы и преобразования из производных классов в базовые классы.
- Явные преобразования (приведения): для явных преобразований требуется выражение приведения. Приведение требуется, если в ходе преобразования данные могут быть утрачены или преобразование может завершиться сбоем по другим причинам. Типичными примерами являются числовое преобразование в тип с меньшей точностью или меньшим диапазоном и преобразование экземпляра базового класса в производный класс.
- Определяемые пользователем преобразования: определяемые пользователем преобразования используют специальные методы, которые можно определить, чтобы включить явные и неявные преобразования между пользовательскими типами, у которых нет связи на основе базового класса. Дополнительные сведения см. в разделе Операторы пользовательского преобразования.
- Преобразования с использованием вспомогательных классов. Чтобы выполнить преобразование между несовместимыми типами, например целыми числами и объектами System.DateTime или шестнадцатеричными строками и массивами байтов, можно использовать классы System.BitConverter и System.Convert, а также методы Parse встроенных числовых типов, такие как Int32.Parse. Дополнительные сведения см. в руководствах по преобразованию массива байтов в значение типа int, преобразованию строки в число и преобразованию из шестнадцатеричных строк в числовые типы.
Неявные преобразования
Для встроенных числовых типов неявное преобразование можно выполнить, если сохраняемое значение может уместиться в переменной без усечения или округления. При использовании целочисленных типов это означает, что диапазон исходного типа является надлежащим подмножеством диапазона для целевого типа. Например, переменная типа long (64-разрядное целое число) может хранить любое значение, которое может хранить переменная int (32-разрядное целое число). В следующем примере компилятор неявно преобразует значение num справа в тип long перед назначением bigNum .
// Implicit conversion. A long can // hold any value an int can hold, and more! int num = 2147483647; long bigNum = num;
Полный список всех неявных числовых преобразований см. в разделе Таблица неявных числовых преобразований в статье Встроенные числовые преобразования.
Для ссылочных типов неявное преобразование всегда предусмотрено из класса в любой из его прямых или косвенных базовых классов или интерфейсов. Никакой специальный синтаксис не требуется, поскольку производный класс всегда содержит все члены базового класса.
Derived d = new Derived(); // Always OK. Base b = d;
Явные преобразования
Однако если преобразование невозможно сделать без риска потери информации, компилятору требуется выполнить явное преобразование, которое называется приведением . Приведение — это способ явного информирования компилятора о том, что вы планируете выполнить преобразование и что вы знаете, что потеря данных может произойти, или приведение может завершиться ошибкой во время выполнения. Чтобы выполнить приведение, укажите тип, к которому выполняется приведение в круглые скобки перед преобразуемой значением или переменной. Следующая программа приводит двойник к int. Программа не будет компилироваться без приведения.
class Test < static void Main() < double x = 1234.7; int a; // Cast double to int. a = (int)x; System.Console.WriteLine(a); >> // Output: 1234
Полный список всех поддерживаемых явных числовых преобразований см. в разделе Таблица явных числовых преобразований в статье Встроенные числовые преобразования.
Для ссылочных типов явное приведение является обязательным, если необходимо преобразовать базовый тип в производный тип:
// Create a new derived type. Giraffe g = new Giraffe(); // Implicit conversion to base type is safe. Animal a = g; // Explicit conversion is required to cast back // to derived type. Note: This will compile but will // throw an exception at run time if the right-side // object is not in fact a Giraffe. Giraffe g2 = (Giraffe)a;
Операция приведения между ссылочными типами не изменяет тип времени выполнения базового объекта; он изменяет только тип значения, используемого в качестве ссылки на этот объект. Дополнительные сведения см. в разделе Полиморфизм.
Исключения преобразования типов во время выполнения
В некоторых преобразованиях ссылочного типа компилятор не может определить, является ли приведение допустимым. Можно выполнить операцию приведения, которая правильно компилируется во время выполнения. Как показано в следующем примере, приведение типа, завершающееся сбоем во время выполнения, приводит InvalidCastException к возникновению ошибки.
class Animal < public void Eat() =>System.Console.WriteLine("Eating."); public override string ToString() => "I am an animal."; > class Reptile : Animal < >class Mammal : Animal < >class UnSafeCast < static void Main() < Test(new Mammal()); // Keep the console window open in debug mode. System.Console.WriteLine("Press any key to exit."); System.Console.ReadKey(); >static void Test(Animal a) < // System.InvalidCastException at run time // Unable to cast object of type 'Mammal' to type 'Reptile' Reptile r = (Reptile)a; >>
Метод Test имеет параметр Animal , поэтому явное приведение a аргумента к Reptile формирует опасное допущение. Это безопаснее, чтобы не делать предположения, а вместо проверка тип. C# предоставляет оператор is, чтобы можно было проверить совместимость перед фактическим выполнением приведения. Дополнительные сведения см. в статье Практическое руководство. Безопасное приведение с помощью сопоставления шаблонов, а также операторов is и as.
Спецификация языка C#
См. также
- Типы
- Выражение приведения
- Операторы пользовательского преобразования
- Обобщенное преобразование типов
- Практическое руководство. Преобразование строки в число
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.