作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要在各种类型(十进制、int32、int64 等)之间进行转换,但我想确保我不会丢失任何数据。我发现正常的 Convert
方法(包括转换)会在没有警告的情况下截断数据。
decimal d = 1.5;
int i = (int)d;
// i == 1
我希望是否有一个转换或 TryConvert 方法,如果转换正在删除数据,该方法会抛出或返回 false。我怎样才能做到这一点?
如果可能的话,我想在一般意义上执行此操作,因此我可以在给定两个 Type
对象和一个 object
实例(其中运行时类型是convertFrom类型)。像这样:
object ConvertExact(object convertFromValue, Type convertToType)
{
if ( ** conversion not possible, or lossy ** )
throw new InvalidCastException();
// return converted object
}
类似于this question ,但这里的数字被截断了。
最佳答案
这个怎么样:
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine(ConvertExact(2.0, typeof(int)));
Console.WriteLine(ConvertExact(2.5, typeof(int)));
}
static object ConvertExact(object convertFromValue, Type convertToType)
{
object candidate = Convert.ChangeType(convertFromValue,
convertToType);
object reverse = Convert.ChangeType(candidate,
convertFromValue.GetType());
if (!convertFromValue.Equals(reverse))
{
throw new InvalidCastException();
}
return candidate;
}
}
请注意,这并不完美 - 例如,它会很乐意将 2.000m 和 2.00m 转换为 2,尽管确实会丢失信息(精确)。但它并没有失去任何幅度,这对你来说可能已经足够了。
关于c# - 如何在两种(数字)数据类型之间进行转换而不丢失任何数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6034946/
我是一名优秀的程序员,十分优秀!