如何在C#中不通过除法将long值格式化为千分之一的字符串?
解决C#中Long类型数值格式化为千分之一显示的问题
你的需求很明确:把long类型的数值以原数千分之一的形式显示,但不直接修改原数值(比如除以1000)。之前尝试的{0:0,000}和{0:0.000}格式不符合预期,因为前者是千分位分隔,后者只是给原数补三位小数,没有实现小数点左移三位的效果。
下面给你两种可行的解决方案:
方案一:利用Decimal精确转换(推荐)
虽然看起来做了除以1000的操作,但这里只是在格式化时临时转换,不会修改原long变量的数值。而且decimal类型可以精确表示所有long范围内的整数,完全不用担心精度损失:
long one = 1; long two = 1005; long three = 100000005; long four = 1111112258552; // 格式化字符串:确保整数部分完整显示,小数部分固定三位 string format = "{0:0.000}"; string s1 = string.Format(format, (decimal)one / 1000m); string s2 = string.Format(format, (decimal)two / 1000m); string s3 = string.Format(format, (decimal)three / 1000m); string s4 = string.Format(format, (decimal)four / 1000m); Console.WriteLine(s1); // 输出: 0.001 Console.WriteLine(s2); // 输出: 1.005 Console.WriteLine(s3); // 输出: 100000.005 Console.WriteLine(s4); // 输出: 1111112258.552
方案二:纯字符串处理(无数值运算)
如果严格要求不进行任何数值运算,我们可以直接对long的字符串形式进行拆分和拼接,把最后三位作为小数部分:
long one = 1; long two = 1005; long three = 100000005; long four = 1111112258552; // 自定义格式化方法 string FormatAsThousandth(long num) { string numStr = num.ToString(); if (numStr.Length <= 3) { // 数字长度不足3位,补0后在开头加小数点 return $"0.{numStr.PadLeft(3, '0')}"; } else { // 拆分整数部分(除最后三位)和小数部分(最后三位) int splitPos = numStr.Length - 3; string integerPart = numStr.Substring(0, splitPos); string decimalPart = numStr.Substring(splitPos); return $"{integerPart}.{decimalPart}"; } } Console.WriteLine(FormatAsThousandth(one)); // 0.001 Console.WriteLine(FormatAsThousandth(two)); // 1.005 Console.WriteLine(FormatAsThousandth(three)); // 100000.005 Console.WriteLine(FormatAsThousandth(four)); // 1111112258.552
为什么你的原有格式不生效?
{0:0,000}:这个格式是用来添加千分位分隔符的,比如1005会显示为1,005,和你要的小数点左移完全无关;{0:0.000}:这个格式是给原数值补三位小数,比如1会显示为1.000,并没有将数值缩小一千倍,所以不符合需求。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

