如何将系统十进制位转换为C#中的字符串?
我希望能够从如何将系统十进制位转换为C#中的字符串?,c#,.net,decimal,C#,.net,Decimal,我希望能够从System.Decimal值中获取位,然后将其转换为值的字符串表示形式,就像Decimal.ToString()一样,但我很难想出算法 所以我有这样的想法: decimal d = 1403.45433M; int[] nDecimalBits = decimal.GetBits(d); // How to convert the 4 integers in nDecimalBits to a string // that contains "1403.45433"? 我知道十
System.Decimal
值中获取位,然后将其转换为值的字符串表示形式,就像Decimal.ToString()
一样,但我很难想出算法
所以我有这样的想法:
decimal d = 1403.45433M;
int[] nDecimalBits = decimal.GetBits(d);
// How to convert the 4 integers in nDecimalBits to a string
// that contains "1403.45433"?
我知道十进制的二进制布局-前3个整数包含值位,最后一个整数包含符号位和比例因子
我试着用各种搜索词搜索算法,但decimal主要用作“浮点数”的同义词,所以我的搜索结果是无关问题的答案
任何帮助都将不胜感激
编辑:为了回答一些问题,我需要将比特发送到另一个平台,在那里需要重建值。十进制及其任何成员函数在那里都不可用,所以我需要获取位并将其转换为字符串
如果我有选择的话,我显然会使用
ToString()
,但这样我就不需要问了。这不是算法,但我想它应该会有所帮助
十进制位:
十进制的二进制表示法
数字由一个1位符号、一个
96位整数和一个比例
用于除以整数的因子
编号并指定其中的哪一部分
是小数。缩放
因子隐式地是数字10,
提升到0到0之间的指数
到28岁
返回值是四个元素
32位有符号整数数组
第一、第二和第三要素
返回的数组的,
96位的中间位和高位32位
整数
返回的第四个元素
数组包含比例因子和
签名它包括以下内容
部分:
低位字0至15为
未使用,并且必须为零
位16至23必须包含指数
介于0和28之间,表示
10的幂除整数
号码
位24至30未使用,必须
零
位31包含符号;0意味着
肯定,1表示否定
您可以使用十进制构造函数将值转换回: 十进制构造函数(Int32[]) 将Decimal的新实例初始化为以二进制表示并包含在指定数组中的十进制值 之后,如果需要,可以使用
ToString
。
例如:
有什么主要原因不能只使用十进制构造函数吗
new decimal(nDecimalBits).ToString();
由于您不能使用
ToString()
,您可能需要了解mono开发人员是如何实现这一点的:
InitDecHexDigits ((uint)bits [2], ((ulong)bits [1] << 32) | (uint)bits [0]);
InitDecHexDigits((uint)位[2],((ulong)位[1]这是真的,但他似乎不喜欢ToString,他想从位(提取96位整数值、指数、符号)构建十进制字符串。为什么需要这样做,为什么不能使用“decimal.ToString()”?+1:没有理由在这里重新发明轮子。使用十进制构造函数将位转换回十进制。你还没有读过我的消息。我没有重新发明轮子的奇怪冲动-我需要在.NET不可用的平台上重新构造十进制的字符串值。我所拥有的只是从十进制中获得的4个整数服务器。我可以发送文本而不是4个整数,但我还需要最小化网络流量。@xxbbcc:我已经阅读了您的消息…关于.NET FW在目标平台上不可用的信息是新的。;-)了解目标平台上可用的技术可能会有所帮助。用Java实现这样的算法(见我对Bugai13答案的评论)可能比C语言要简单得多。我添加了第二个答案,其中包含mono实现的链接,它只适用于uint/ulong数据类型和一些位移位魔法。谢谢你的回答-我已经有了这些细节。我可以进行二进制到字符串的转换,但十进制是一个更复杂的情况(处理低整数中的位时,高整数中的位需要移位)我还没有想出一个解决方案。@xxbbcc:我不知道为什么这对您没有帮助……它准确地描述了十进制在整数数组中的存储格式。我想算法相当简单:将前三个整数连接成某种大整数数据类型(如Java的BigInteger类型),然后使用第四个整数来确定小数点的位置。如果您告诉我们您在尝试确定算法时的具体位置,可能会有所帮助。我的工作期限非常紧迫,目标平台上对小数的支持是在最后一分钟提出的。在转换过程中,我必须保留所有的小数点他使用十进制数字,所以使用双精度是毫无疑问的-舍入错误(十进制本身之外)是不允许的,所以我必须在输入位时直接进行十进制到字符串的转换。移位到正确的位数是我遇到的问题-int32是我在转换过程中可以使用的最大数字类型。Heinzi,谢谢-我没有想到这一点。我会检查一下,这可能正是我想要的。出于我的目的,BCD几乎和一个直字符串一样好,而从BCD转换字符串是微不足道的,正如您所说。再次感谢您的帮助。
InitDecHexDigits ((uint)bits [2], ((ulong)bits [1] << 32) | (uint)bits [0]);