2012-06-14 60 views
13

我想将小数转换为字符串,并将逗号作为数千个分隔符,并保留与创建小数点时相同的精度。 (将有2-5位有效数字)使用逗号格式化小数,保留尾随零

 decimal d = 1234.4500M; 

     //I'd like "1,234.4500" 

     var notRight = d.ToString("###,###.#######");  //1,234.45 
     var alsoNotRight = d.ToString("###,###.00000");; //1,234.45000 
     var notRightEither = d.ToString("N"); //1,234.45 
     var notRightEither2 = d.ToString("G"); //1234.45000 

是否没有内置的方法来做到这一点,而不需要手动解析字符串?如果没有单个格式字符串,那么执行此操作的最简单方法是什么?

+0

我决定研究如何完成格式化。不幸的是,繁重的工作并不是托管代码(不出所料)看着[标准数字格式字符串](http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString),它看起来只有''G “'(默认)保留空格。 – Guvante

回答

12

根据documentation,十进制数保留后面的零。如果您使用“G”说明符或根本没有说明符,则可以显示它们。当您使用包含千位分隔符的其中一个说明符时,它们会丢失。

如果要指定尾随转换为字符串时零的个数,可以通过格式字符后加入a precision specifier(0〜99位),这样做:

decimal d=1234.45M; 
var numberAsString=d.ToString("N4"); 

结果将是

1,234.4500 

UPDATE: 你可以得到使用Decimal.GetBits方法,它返回数的二进制表示的小数位数。小数位数存储在第四个元素的位16-23(第三个字节)中。

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

...

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

入门使用全数字字符串表示可以做这样的:

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 
+0

你是部分错误。尽管调试器将显示小数的值等于1234.45,但是尾部的0仍然保留。例如,尝试下面的代码:'decimal d = 1234.4500M;''Console.WriteLine(d); //输出1234.4500'。 –

+1

您的回答只涵盖了数字正好有4位小数的例子。我相信他试图保留原始小数(2-5)。 –

+1

格式被指定为一个数字除以10的幂。因此,它可以存储12345/100或1234500/10000区别。 – Guvante

1

由于你打算有一个可变小数位数(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 
} 
+0

您可以从小数点的二进制表示中提取数字的位数并构造一个正确位数的格式字符串 –

+0

您还在使用文化特定的分隔符,这意味着如果在使用“ ,'用于小数点,如法国,德国,西班牙,意大利,希腊,南非 –

+0

我喜欢它 - 从一眼就可以轻松理解代码。尽管如果该值没有小数部分(如5M),您可以获得索引超出范围 – foson