使用或不使用符号将十进制转换为16个字符串

时间:2014-01-28 16:25:37

标签: c# parsing decimal

我正在寻找一种方法,在小数点前最多可添加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并且没有添加减号。

如果有人可以帮我解决这个问题,我将非常感激!

2 个答案:

答案 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"

注意:这不会照顾你的舍入,但我不清楚你的要求是什么。