Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将系统十进制位转换为C#中的字符串?_C#_.net_Decimal - Fatal编程技术网

如何将系统十进制位转换为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]);