如何在 C# 中将 System.Decimal 位转换为字符串?

发布于 2024-10-27 18:40:39 字数 598 浏览 2 评论 0原文

我希望能够从 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 个整数包含值位,最后一个整数包含符号位和比例因子。

我尝试使用各种搜索词来搜索算法,但十进制主要用作“浮点数”的同义词,因此我的搜索找到了不相关问题的答案。

任何帮助将不胜感激。

编辑:为了回应一些答案,我需要将这些位发送到需要重建值的不同平台。 System.Decimal 及其任何成员函数在那里不可用,因此我需要获取这些位并将它们转换为字符串。

如果我有选择的话,我显然会使用 ToString() 但这样我就不需要询问了。

I'd like to be able to get the bits from a System.Decimal value and then convert that to the string representation of the value, much like Decimal.ToString() would do but I have a hard time coming up with the algorithm.

So I have something like this:

decimal d = 1403.45433M;
int[] nDecimalBits = decimal.GetBits(d);

// How to convert the 4 integers in nDecimalBits to a string
// that contains "1403.45433"?

I know the binary layout of the decimal - the first 3 integers contain the value bits and the last integer contains the sign bit and the scaling factor.

I tried searching for the algorithm using various search terms but decimal is mostly used as a synonym for 'floating-point number' so my searches turned up answers to unrelated problems.

Any help would be appreciated.

Edit: in response to some answers, I need to send the bits to a different platform where the value needs to be reconstructed. System.Decimal and any of its member functions are not available there, so I need to grab the bits and translate them to a string.

If I had a choice, I'd obviously use ToString() but then I wouldn't need to ask.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

寄居人 2024-11-03 18:40:39

您可以使用 Decimal 构造函数 Decimal(Int32[]) 将您的值转换回来:

十进制构造函数(Int32[])

将 Decimal 的新实例初始化为以二进制表示并包含在指定数组中的十进制值。

之后,如果需要,您可以使用 ToString
例子:

decimal d = 1403.45433M;
int[] nDecimalBits = decimal.GetBits(d);

decimal d2 = new decimal(nDecimalBits);
string s = d2.ToString();

You can use the Decimal constructor Decimal(Int32[]) to convert your value back:

Decimal Constructor (Int32[])

Initializes a new instance of Decimal to a decimal value represented in binary and contained in a specified array.

Afterwards, you can use ToString if you want.
Example:

decimal d = 1403.45433M;
int[] nDecimalBits = decimal.GetBits(d);

decimal d2 = new decimal(nDecimalBits);
string s = d2.ToString();
愛放△進行李 2024-11-03 18:40:39

这不是算法,但我想它应该有帮助。

小数位结构

十进制的二进制表示
数字由 1 位符号、
96 位整数和缩放
用于除以整数的因子
数字并指定它的哪一部分
是小数。缩放比例
因子隐式是数字 10,
提升至 0 范围内的指数
到 28。

返回值是一个四元素
32 位有符号整数数组。

第一个、第二个和第三个元素
返回的数组包含低,
96位的中、高32位
整数。

返回的第四个元素
数组包含比例因子和
符号。它由以下部分组成
零件:

位 0 到 15(低位字)是
未使用且必须为零。

第 16 位到第 23 位必须包含指数
0 到 28 之间,表示
10 的幂来除整数
数量。

位 24 至 30 未使用,必须
零。

位 31 包含符号; 0 含义
正数,1 表示负数。

It's does not algoritm, but i suppose it should help.

Decimal bits structure:

The binary representation of a Decimal
number consists of a 1-bit sign, a
96-bit integer number, and a scaling
factor used to divide the integer
number and specify what portion of it
is a decimal fraction. The scaling
factor is implicitly the number 10,
raised to an exponent ranging from 0
to 28.

The return value is a four-element
array of 32-bit signed integers.

The first, second, and third elements
of the returned array contain the low,
middle, and high 32 bits of the 96-bit
integer number.

The fourth element of the returned
array contains the scale factor and
sign. It consists of the following
parts:

Bits 0 to 15, the lower word, are
unused and must be zero.

Bits 16 to 23 must contain an exponent
between 0 and 28, which indicates the
power of 10 to divide the integer
number.

Bits 24 to 30 are unused and must be
zero.

Bit 31 contains the sign; 0 meaning
positive, and 1 meaning negative.

錯遇了你 2024-11-03 18:40:39

有什么主要原因不能只使用十进制构造函数吗?

new decimal(nDecimalBits).ToString();

Is there any major reason you can't just use the decimal constructor?

new decimal(nDecimalBits).ToString();
久而酒知 2024-11-03 18:40:39

由于您无法使用 ToString(),您可能需要查看单声道开发人员如何实现此功能:

该条目点是 NumberToString(string,decimal, IFormatProvider )

有趣的部分是 InitDecHexDigits(uint, ulong ),它被这样调用

InitDecHexDigits ((uint)bits [2], ((ulong)bits [1] << 32) | (uint)bits [0]);

,并执行“位杂耍和移位”操作,将三个整数转换为 二进制编码的小数 (_val1_val4),然后可以(简单地)转换为字符串。

(不要对他们称之为“十六进制表示”的事实感到困惑。它是二进制编码的十进制数字。)

Since you cannot use ToString(), you might want to check out how the mono developers implemented this:

The entry point is NumberToString(string, decimal, IFormatProvider).

The interesting part is InitDecHexDigits(uint, ulong), which gets called like this

InitDecHexDigits ((uint)bits [2], ((ulong)bits [1] << 32) | (uint)bits [0]);

and does the "bit juggling and shifting" thing to convert the three integers into binary coded decimals (_val1 to _val4), which can then be (trivially) converted into a string.

(Don't get confused by the fact that they call it "hex representation". It's binary coded decimal digits.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文