我正在寻找一种方法,在小数点前最多可添加16个字符,如果值为负,则添加减号。如,
18,52变为000000000000001852,并且 -18,52变为-00000000000001852
我知道如何通过使用替换和if语句以及使用PadLeft
方法实现此方法,其中字符填充到左侧指定的长度。但我不确定如何准确地做到这一点。
我现在拥有的是:
static string FormatDecimal(decimal d, int length = 0, char a = '0')
{
var sb = new StringBuilder();
var rounded = decimal.Round(d, 2, MidpointRounding.AwayFromZero);
if (rounded < 0)
{
sb.Append("-");
}
else
{
sb.Append("");
}
var lastPart = rounded.ToString().Replace(",", "").Replace(".", "");
var lengthMiddle = length - sb.Length - lastPart.Length;
for (int i = 0; i < lengthMiddle; i++)
{
sb.Append(a);
}
sb.Append(lastPart);
return sb.ToString();
}
当我查看代码并执行Console.WriteLine(FormatDecimal(-18m, 16, '0'))
时,我看到了
代码是1.非常长,2。它不起作用...舍入失败并保持-18并且没有添加减号。
如果有人可以帮我解决这个问题,我将非常感激!
答案 0 :(得分:4)
如果要在字符串和中表示两位小数,请删除小数点,您只需将数字乘以100.要填充最多16位数,请使用D
format string:
decimal d = -18.52m;
string s = ((int)(d * 100)).ToString("D16");
修改:如果您只想为负数填充最多15位数字,则可以使用条件:
decimal d = -18.52m;
int i = (int)(d * 100);
string s = i.ToString(i >= 0 ? "D16" : "D15");
或者,您可以使用section separators:
在格式字符串本身中表达条件string s = i.ToString("0000000000000000;-000000000000000");
答案 1 :(得分:0)
不要自己构建,而是使用已有的东西。 decimal.ToString()
将为您格式化一个数字:
decimal d = 18.52;
string s = d.ToString("0000000000.##"); // = "0000000018.52"
decimal d = 18.00;
string s = d.ToString("0000000000.##"); // = "0000000018"
您可以使用字符串构造函数构建格式字符串:
int length = 10;
string formatString = string.Concat(new string('0', length), ".##")
string s = d.ToString(formatString); // = "0000000018"
注意:这不会照顾你的舍入,但我不清楚你的要求是什么。