Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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_String Formatting - Fatal编程技术网

C# 用逗号格式化十进制,保留尾随零

C# 用逗号格式化十进制,保留尾随零,c#,.net,decimal,string-formatting,C#,.net,Decimal,String Formatting,我想将一个十进制数转换成一个字符串,用逗号作为千位分隔符,并保持创建十进制数时的精度。(将有2-5个有效数字) 没有内置的方法可以在不手动解析字符串的情况下执行此操作吗?如果没有单一格式的字符串,最简单的方法是什么?根据,小数保留后面的零。如果使用“G”说明符或根本不使用说明符,则可以显示它们。当您使用其中一个包含1000个分隔符的说明符时,它们将丢失 如果要在转换为字符串时指定尾随零的数量,可以在格式字符后添加(0到99位),如下所示: decimal d=1234.45M; var numb

我想将一个十进制数转换成一个字符串,用逗号作为千位分隔符,并保持创建十进制数时的精度。(将有2-5个有效数字)

没有内置的方法可以在不手动解析字符串的情况下执行此操作吗?如果没有单一格式的字符串,最简单的方法是什么?

根据,小数保留后面的零。如果使用“G”说明符或根本不使用说明符,则可以显示它们。当您使用其中一个包含1000个分隔符的说明符时,它们将丢失

如果要在转换为字符串时指定尾随零的数量,可以在格式字符后添加(0到99位),如下所示:

decimal d=1234.45M;
var numberAsString=d.ToString("N4");
decimal d=1234.45000M;
var nums=Decimal.GetBits(d);
var decimals=BitConverter.GetBytes(nums[3])[2];
var formatStr="N"+decimals;
d.ToString(formatStr);
结果将是

 1,234.4500
更新: 您可以使用返回数字二进制表示形式的方法来获取十进制数字。小数位数存储在第四个元素的位16-23(第三个字节)中

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

位16到23必须包含一个介于0和28之间的指数,表示整数除以10的幂。

使用所有数字获取字符串表示可以如下所示:

decimal d=1234.45M;
var numberAsString=d.ToString("N4");
decimal d=1234.45000M;
var nums=Decimal.GetBits(d);
var decimals=BitConverter.GetBytes(nums[3])[2];
var formatStr="N"+decimals;
d.ToString(formatStr);
那会产生什么

1,234.45000

由于您计划使用一个可变的小数位数(2-5),我认为您无法通过字符串格式实现它

这个解决方案不一定漂亮,但它完成了任务。请注意,它将在这个过程中分配多个字符串(我相信是5个),因此在大规模使用中可能无法很好地执行。您将保留小数位数,并在小数点之前的部分中获得逗号分隔的组

public static string FormatDecimal(decimal d)
{
    return d.ToString("N0") + // Format portion before decimal
           "." + 
           d.ToString().Split('.')[1];  // Retain number of decimal places
}

你有一部分是错的。尽管调试器将显示小数点的值等于1234.45,但保留尾随的0。例如,尝试以下代码:
decimald=1234.4500M
控制台。写入线(d);//输出1234.4500
。您的答案仅涵盖数字正好有4位小数的示例。我相信他是在试图保留原来的小数位数(2-5)。格式指定为数字除以10的幂。因此,它可以存储12345/100或1234500/10000不同。感谢Guvante的背景信息。我不知道!现在我知道它为什么一直跟在0后面了。为了显示如何从二进制表示中提取位数,我决定研究格式化是如何完成的。不幸的是,繁重的工作不是托管代码(不足为奇),从中看,似乎只有
“G”
(默认值)保留了空白。您可以从十进制的二进制表示形式中提取位数,并使用正确的位数构建格式字符串。您还使用了区域性特定的分隔符,这意味着如果你的代码在一个使用“,”来表示小数的文化中使用,你的代码将被破坏,比如法国、德国、西班牙、意大利、希腊、南非。我喜欢它——只要看一眼代码就很容易理解。尽管如果该值没有小数部分(如5M),则可能会得到超出范围的索引。我试图为解决方案找到一个起码的起点。它肯定不是全球化的,不处理没有小数的数字(OP的用例是2-5小数)。看起来Panagiotis已经提出了一个完整的解决方案,所以我不会再更新了。