Có cách nào để xác định có hay không. Loại Net là một số? Ví dụ: System.UInt32/UInt16/Double
là tất cả các số. Tôi muốn tránh trường hợp chuyển đổi dài trên Type.FullName
.C# - cách xác định Loại có phải là số
Trả lời
Hãy thử điều này:
Type type = object.GetType();
bool isNumber = (type.IsPrimitiveImple && type != typeof(bool) && type != typeof(char));
Các loại nguyên thủy là Boolean, Byte, SByte, Int16, uint16, Int32, UInt32, Int64, UInt64, Char, đôi, và Độc.
Lấy Guillaume's solution xa hơn một chút:
public static bool IsNumericType(this object o)
{
switch (Type.GetTypeCode(o.GetType()))
{
case TypeCode.Byte:
case TypeCode.SByte:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.Decimal:
case TypeCode.Double:
case TypeCode.Single:
return true;
default:
return false;
}
}
Cách sử dụng:
int i = 32;
i.IsNumericType(); // True
string s = "Hello World";
s.IsNumericType(); // False
Vì vậy, loại 'thập phân' không phải là số? – LukeH
Các kiểu nguyên thủy là Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double và Single. –
@Luke - câu hỏi hay. Đó là một cấu trúc - vì vậy bạn cần xác định số. –
Bạn có thể sử dụng Type.IsPrimitive và sau đó phân loại ra các Boolean
và Char
loại, một cái gì đó như thế này:
bool IsNumeric(Type type)
{
return type.IsPrimitive && type!=typeof(char) && type!=typeof(bool);
}
EDIT: Bạn có thể muốn loại trừ IntPtr
và UIntPtr
loại là tốt, nếu bạn don' t coi chúng là số.
Rất tiếc, các loại này không có nhiều điểm chung, trừ các loại giá trị. Nhưng để tránh trường hợp chuyển đổi dài, bạn chỉ có thể xác định danh sách chỉ đọc với tất cả các loại này và sau đó chỉ cần kiểm tra xem loại đã cho có nằm trong danh sách hay không.
Không sử dụng một công tắc - chỉ cần sử dụng một bộ:
HashSet<Type> NumericTypes = new HashSet<Type>
{
typeof(decimal), typeof(byte), typeof(sbyte),
typeof(short), typeof(ushort), ...
};
EDIT: Một lợi thế của việc này qua sử dụng một mã loại là khi loại số mới được đưa vào NET (ví dụ BigInteger và Complex) dễ điều chỉnh - trong khi các loại đó sẽ không nhận mã loại.
Câu trả lời ngắn: Số
Câu trả lời dài hơn: Không.
Thực tế là nhiều loại khác nhau trong C# có thể chứa dữ liệu số. Trừ khi bạn biết những gì mong đợi (Int, Double, vv), bạn cần phải sử dụng câu lệnh "long".
oops! Đã hiểu sai câu hỏi! Cá nhân, sẽ cuộn với Skeet's.
HRM, âm thanh như bạn muốn DoSomething
trên Type
dữ liệu của bạn. Những gì bạn có thể làm là:
public class MyClass
{
private readonly Dictionary<Type, Func<SomeResult, object>> _map =
new Dictionary<Type, Func<SomeResult, object>>();
public MyClass()
{
_map.Add (typeof (int), o => return SomeTypeSafeMethod ((int)(o)));
}
public SomeResult DoSomething<T>(T numericValue)
{
Type valueType = typeof (T);
if (!_map.Contains (valueType))
{
throw new NotSupportedException (
string.Format (
"Does not support Type [{0}].", valueType.Name));
}
SomeResult result = _map[valueType] (numericValue);
return result;
}
}
Đây là tất cả các loại giá trị (ngoại trừ bool và có thể enum).Vì vậy, bạn chỉ đơn giản là có thể sử dụng:
bool IsNumberic(object o)
{
return (o is System.ValueType && !(o is System.Boolean) && !(o is System.Enum))
}
Điều này sẽ trả về true cho bất kỳ 'struct' do người dùng định nghĩa ... Tôi không nghĩ đó là điều bạn muốn. –
Bạn đã đúng. Các kiểu số tích hợp cũng là cấu trúc. Vì vậy, tốt hơn đi với so sánh nguyên thủy sau đó. – MandoMando
public static bool IsNumericType(Type type)
{
switch (Type.GetTypeCode(type))
{
case TypeCode.Byte:
case TypeCode.SByte:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.Decimal:
case TypeCode.Double:
case TypeCode.Single:
return true;
default:
return false;
}
}
Lưu ý về tối ưu hóa loại bỏ (xem ý kiến enzi)
Và nếu bạn thực sự muốn tối ưu hóa nó (mất khả năng đọc và một số an toàn ...):
public static bool IsNumericType(Type type)
{
TypeCode typeCode = Type.GetTypeCode(type);
//The TypeCode of numerical types are between SByte (5) and Decimal (15).
return (int)typeCode >= 5 && (int)typeCode <= 15;
}
Tôi biết câu trả lời này là cũ, nhưng gần đây tôi đã đi qua một chuyển đổi như vậy: không sử dụng tối ưu hóa được đề xuất! Tôi nhìn vào mã IL được tạo ra từ một công tắc như vậy, và lưu ý rằng trình biên dịch đã áp dụng tối ưu hóa (trong IL 5 được trừ khỏi mã loại và sau đó các giá trị từ 0 đến 10 được coi là đúng). Do đó việc chuyển đổi nên được sử dụng cho nó dễ đọc hơn và an toàn hơn và cũng nhanh như vậy. – enzi
Nếu bạn thực sự muốn tối ưu hóa nó và không quan tâm đến khả năng đọc thì mã tối ưu sẽ là 'return unchecked ((uint) Type.GetTypeCode (type) - 5u) <= 10u;' do đó loại bỏ nhánh được giới thiệu bởi '&&' . – AnorZaken
Không ai trong số các giải pháp cần Nul lable vào tài khoản.
tôi sửa đổi giải pháp Jon Skeet một chút:
private static HashSet<Type> NumericTypes = new HashSet<Type>
{
typeof(int),
typeof(uint),
typeof(double),
typeof(decimal),
...
};
internal static bool IsNumericType(Type type)
{
return NumericTypes.Contains(type) ||
NumericTypes.Contains(Nullable.GetUnderlyingType(type));
}
Tôi biết tôi chỉ có thể thêm nullables bản thân để HashSet tôi. Nhưng giải pháp này tránh được nguy cơ quên thêm một Nullable cụ thể vào danh sách của bạn.
private static HashSet<Type> NumericTypes = new HashSet<Type>
{
typeof(int),
typeof(int?),
...
};
Là một loại nullable thực sự là số? Null không phải là một con số, theo hiểu biết của tôi. – IllidanS4
Điều đó phụ thuộc vào những gì bạn muốn đạt được. Trong trường hợp của tôi, tôi cũng cần bao gồm cả null. Nhưng tôi cũng có thể nghĩ về những tình huống mà đây không phải là hành vi mong muốn. –
Cách tiếp cận dựa trên Philip's proposal, tăng cường với SFun28's inner type check cho Nullable
loại:
public static class IsNumericType
{
public static bool IsNumeric(this Type type)
{
switch (Type.GetTypeCode(type))
{
case TypeCode.Byte:
case TypeCode.SByte:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.Decimal:
case TypeCode.Double:
case TypeCode.Single:
return true;
case TypeCode.Object:
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
return Nullable.GetUnderlyingType(type).IsNumeric();
//return IsNumeric(Nullable.GetUnderlyingType(type));
}
return false;
default:
return false;
}
}
}
Tại sao điều này? Tôi phải kiểm tra xem một số Type type
có phải là một loại số không, và không nếu một số object o
tùy ý là số.
Về cơ bản giải pháp Skeet nhưng bạn có thể tái sử dụng nó với các loại Nullable như sau:
public static class TypeHelper
{
private static readonly HashSet<Type> NumericTypes = new HashSet<Type>
{
typeof(int), typeof(double), typeof(decimal),
typeof(long), typeof(short), typeof(sbyte),
typeof(byte), typeof(ulong), typeof(ushort),
typeof(uint), typeof(float)
};
public static bool IsNumeric(Type myType)
{
return NumericTypes.Contains(Nullable.GetUnderlyingType(myType) ?? myType);
}
}
Điều này có thể làm việc tốt. Tuy nhiên, bạn có thể muốn theo dõi nó bằng Type.Parse để truyền theo cách bạn muốn sau đó.
public bool IsNumeric(object value)
{
float testValue;
return float.TryParse(value.ToString(), out testValue);
}
Modified của Skeet và giải pháp arviman của sử dụng Generics
, Reflection
, và C# v6.0
.
private static readonly HashSet<Type> m_numTypes = new HashSet<Type>
{
typeof(int), typeof(double), typeof(decimal),
typeof(long), typeof(short), typeof(sbyte),
typeof(byte), typeof(ulong), typeof(ushort),
typeof(uint), typeof(float), typeof(BigInteger)
};
Tiếp theo bởi:
public static bool IsNumeric<T>(this T myType)
{
var IsNumeric = false;
if(myType != null)
{
IsNumeric = m_numTypes.Contains(myType.GetType());
}
return IsNumeric;
}
Cách sử dụng cho (T item)
:
if (item.IsNumeric()) {}
null
lợi nhuận sai.
Với C# 7 phương pháp này mang lại cho tôi hiệu suất tốt hơn so với trường hợp chuyển đổi trên TypeCode
và HashSet<Type>
:
public static bool IsNumeric(this object o) => o is byte || o is sbyte || o is ushort || o is uint || o is ulong || o is short || o is int || o is long || o is float || o is double || o is decimal;
thử nghiệm đang theo dõi:
public static class Extensions
{
public static HashSet<Type> NumericTypes = new HashSet<Type>()
{
typeof(byte), typeof(sbyte), typeof(ushort), typeof(uint), typeof(ulong), typeof(short), typeof(int), typeof(long), typeof(decimal), typeof(double), typeof(float)
};
public static bool IsNumeric1(this object o) => NumericTypes.Contains(o.GetType());
public static bool IsNumeric2(this object o) => o is byte || o is sbyte || o is ushort || o is uint || o is ulong || o is short || o is int || o is long || o is decimal || o is double || o is float;
public static bool IsNumeric3(this object o)
{
switch (o)
{
case Byte b:
case SByte sb:
case UInt16 u16:
case UInt32 u32:
case UInt64 u64:
case Int16 i16:
case Int32 i32:
case Int64 i64:
case Decimal m:
case Double d:
case Single f:
return true;
default:
return false;
}
}
public static bool IsNumeric4(this object o)
{
switch (Type.GetTypeCode(o.GetType()))
{
case TypeCode.Byte:
case TypeCode.SByte:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.Decimal:
case TypeCode.Double:
case TypeCode.Single:
return true;
default:
return false;
}
}
}
class Program
{
static void Main(string[] args)
{
var count = 100000000;
//warm up calls
for (var i = 0; i < count; i++)
{
i.IsNumeric1();
}
for (var i = 0; i < count; i++)
{
i.IsNumeric2();
}
for (var i = 0; i < count; i++)
{
i.IsNumeric3();
}
for (var i = 0; i < count; i++)
{
i.IsNumeric4();
}
//Tests begin here
var sw = new Stopwatch();
sw.Restart();
for (var i = 0; i < count; i++)
{
i.IsNumeric1();
}
sw.Stop();
Debug.WriteLine(sw.ElapsedMilliseconds);
sw.Restart();
for (var i = 0; i < count; i++)
{
i.IsNumeric2();
}
sw.Stop();
Debug.WriteLine(sw.ElapsedMilliseconds);
sw.Restart();
for (var i = 0; i < count; i++)
{
i.IsNumeric3();
}
sw.Stop();
Debug.WriteLine(sw.ElapsedMilliseconds);
sw.Restart();
for (var i = 0; i < count; i++)
{
i.IsNumeric4();
}
sw.Stop();
Debug.WriteLine(sw.ElapsedMilliseconds);
}
- 1. Xác định xem loại có phải là số
- 2. Cách xác định xem một chuỗi có phải là số trong C#
- 3. Xác định xem đối tượng có phải là số nguyên
- 4. Xác định xem thuộc tính có phải là loại mảng không bằng cách phản ánh
- 5. Cách xác định xem EXE có phải là WPF
- 6. C# xác định loại chung
- 7. Xác định loại đối số của hàm sau ")", nó có phải là một tiêu chuẩn rất cũ?
- 8. Cách xác định xem chuỗi có phải là URL trong Mục tiêu-C
- 9. Xác định xem char có phải là số hoặc chữ cái
- 10. Xác định xem thiết bị có phải là Kindle
- 11. Xác định xem loại là điển
- 12. Cách xác định hằng số thành viên loại trong F #?
- 13. Đây có phải là mã C++ 0x chính xác không?
- 14. Các tham số hàm mặc định có phải là hằng số trong C++ không?
- 15. Có phải tên C++ mangling (trang trí) xác định?
- 16. C#: Kiểm tra xem loại T có phải là bool
- 17. Xác định một cách xác định xem một số lớn là số nguyên tố hay composite?
- 18. Làm cách nào để xác định loại biến? (không phải loại đối tượng)
- 19. Xác định qua C# xem chuỗi có phải là đường dẫn tệp hợp lệ
- 20. Cách tốt nhất để xác định các loại dữ liệu đại số bằng Python là gì?
- 21. Không phải là độ chính xác của Double Type là 15 chữ số trong C#?
- 22. C# - Cách kiểm tra xem một thể hiện có phải là giá trị mặc định cho loại
- 23. Cách xác định loại ID mạnh trong C++ 11?
- 24. Mẫu khách truy cập có phải là cách nhanh nhất để phân biệt các loại thông số trong C++ không?
- 25. Xác định loại tệp bằng C#
- 26. Cách xác định xem ParameterInfo có thuộc loại chung không?
- 27. loại mới không thể xác định loại trả về - C++
- 28. Cách xác định phải thừa kế lớp
- 29. Mẫu C++: cách xác định xem loại có phù hợp với phân lớp
- 30. Cách xác định đường dẫn có phải là thư mục phụ của thư mục khác không?
Dupe của nhiều người, nhiều, rất nhiều. Tại sao điều này chưa được đóng? – Noldorin
Bản sao của http://stackoverflow.com/questions/1130698/ và rất gần với một số người khác. –
có thể trùng lặp của [Sử dụng .Net, làm thế nào tôi có thể xác định xem một loại có phải là một loại giá trị số không?] (Http: // stackoverflow.com/questions/124411/using-net-how-can-i-defined-if-a-type-là-a-số-valuetype) – nawfal