【问题标题】:Decimal formatting十进制格式
【发布时间】:2013-03-01 20:35:58
【问题描述】:

我有一个小数 = 123456 和一个整数 = 5 我想插入“。”在我的小数点后第五位,得到 1.23456 如何使用标准格式化函数来做到这一点(即不除以 10 的幂,然后才格式化以添加缺失的零)? 谢谢。

【问题讨论】:

  • 等等,你想不做数学就从 12345 转到 1.2345?祝你好运......
  • 如果我可以问,你为什么不想分开?
  • @AdrianCarneiro 1.2345 = 12345 * .0001
  • 你运气不好,number scaling 的步长为 1000,而不是 10000 或 100000。你必须除以。
  • 好的,12345 1.2345 还是 0.12345?

标签: c# formatting decimal


【解决方案1】:

你想要这样的东西吗?

decimal d = 10000000;
int n=4;

string s = d.ToString();
var result = s.Substring(0, s.Length - n) + "." + s.Substring(s.Length - n);

【讨论】:

  • 第一个输入被认为是一个小数,这增加了 10.00001 的可能性,比如说。您的代码将变为 10.0.0001
  • 你听说过实例方法Insert,如s.Insert(i, ".")吗?
  • @JeppeStigNielsen 非常感谢。你让我学到了新东西。看我的回答
【解决方案2】:

这实际上很有趣,至少我认为是这样。我希望我不会因为输入负数或考虑可能的十进制输入而愚蠢地过火......

            decimal input;
            int offset;
            string working = input.ToString();
            int decIndex = working.IndexOf('.');
            if (offset > 0)
            {
                if (decIndex == -1)
                {
                    working.PadLeft(offset, '0');
                    working.Insert(working.Length - offset, ".");
                }
                else
                {
                    working.Remove(decIndex, 1);
                    decIndex -= offset;
                    while (decIndex < 0)
                    {
                        working.Insert(0, "0");
                        decIndex++;
                    }
                    working.Insert(decIndex, ".");
                }
            }
            else if (offset < 0)
            {
                if (decIndex == -1)
                {
                    decIndex = working.Length();
                }
                if (decIndex + offset > working.Length)
                {
                    working.PadRight(working.Length - offset, '0');
                }
                else
                {
                    working.Remove(decIndex, 0);
                    working.Insert(decIndex + offset, ".");
                }

            }

【讨论】:

  • 我为您的努力鼓掌,先生。如果没有别的,你已经证明不将其除以 100,000 并使用 ToString() 是疯狂的。
  • 耶!这就是我想要的。
【解决方案3】:

这很丑;真正的价值是什么? 12345 还是 1.2345?为什么要存储 12345,然后尝试将其表示不同的数字?离开你试图传达你实际拥有的东西是一个定点(编码)值,你需要先解码它。即

decimal fixedPoint = 12345
decimaldecoded = fixedPoint / (decimal)10000
decoded.ToString();

所以在你的代码中你应该定义你有一个

var fixedPoint = new FixedPointValue(12345, 5);
var realValue = fixedPoint.Decode();

如果任何其他程序员看到这个,很明显为什么你必须以这种方式格式化它。

【讨论】:

  • 我并不经常让人们失望,但如果那个替身还没有很快消失,恐怕我不得不这样做。
  • 不知道你为什么投反对票(在第二次编辑时允许错字)......他以十进制存储 12345 并期望字符串格式的版本代表不同的数字!在这种情况下,该值是定点的。
  • 我还没有。现在会了。他使用十进制,你使用双精度。更糟糕的是,他几乎肯定会使用小数甚至整数来避免浮点固有的不准确性。
  • 这是否否定了我的观点?他的十进制存储一个值,而字符串表示是一个完全不同的值?我将编辑更改为十进制,但我仍然认为我的观点成立。
  • 很抱歉,我的“不知道你为什么投反对票”是为了另一票。你在我回复之前发表了评论。 :( 我编辑的答案现在更好了吗?
【解决方案4】:

您可以通过String.Insert 完成此操作

decimal d = 100000000000;
string str = d.ToString();
int i = 5;
string str2 = str.Insert(str.Length - i, ".");
Console.WriteLine(str2);
Console.Read();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多