C# 十进制格式
我有一个十进制=123456和一个整数=5 我想在右边小数点的第五个位置插入“.”,得到1.23456 如何使用标准的格式化函数(即不除以10的幂,然后格式化以添加缺少的零)来实现这一点?C# 十进制格式,c#,formatting,decimal,C#,Formatting,Decimal,我有一个十进制=123456和一个整数=5 我想在右边小数点的第五个位置插入“.”,得到1.23456 如何使用标准的格式化函数(即不除以10的幂,然后格式化以添加缺少的零)来实现这一点? 谢谢。你想要这样的吗 decimal d = 10000000; int n=4; string s = d.ToString(); var result = s.Substring(0, s.Length - n) + "." + s.Substring(s.Length - n); 这很难看,;真正的
谢谢。你想要这样的吗
decimal d = 10000000;
int n=4;
string s = d.ToString();
var result = s.Substring(0, s.Length - n) + "." + s.Substring(s.Length - n);
这很难看,;真正的价值是什么?12345还是1.2345?为什么要存储12345,然后尝试将其表示为不同的数字?你想要表达的是一个定点(编码)值,你需要先对它进行解码。i、 e
decimal fixedPoint = 12345
decimaldecoded = fixedPoint / (decimal)10000
decoded.ToString();
因此,在代码中,您应该定义
var fixedPoint = new FixedPointValue(12345, 5);
var realValue = fixedPoint.Decode();
如果其他程序员看到了这一点,那么很容易理解为什么必须以这种方式格式化它 您可以通过
这真的很有趣,至少,我想是的。我希望我没有因为输入负数或考虑可能的十进制输入而愚蠢地过火
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, ".");
}
}
十进制输入;
整数偏移量;
字符串工作=input.ToString();
int decIndex=working.IndexOf('.');
如果(偏移量>0)
{
如果(decIndex==-1)
{
工作。左焊盘(偏移量“0”);
加工.插入(加工.长度-偏移量,“.”;
}
其他的
{
工作。移除(decIndex,1);
decIndex-=偏移量;
while(decIndex<0)
{
工作。插入(0,“0”);
decIndex++;
}
工作。插入(decIndex,“.”;
}
}
否则如果(偏移量<0)
{
如果(decIndex==-1)
{
decIndex=工作长度();
}
if(十进制+偏移>工作长度)
{
working.PadRight(working.Length-偏移量“0”);
}
其他的
{
工作。移除(decIndex,0);
工作。插入(十进制+偏移量,“.”;
}
}
等等,你想不做数学就从12345转到1.2345吗?祝你好运…如果我可以问的话,你为什么不想分开呢?@AdrianCarneiro 1.2345=12345*.0001你运气不好,步数是1000,而不是10000或100000。你必须除法。好的,123451.2345或0.12345是什么?第一个输入被称为十进制,这增加了10.00001的可能性。您的代码将转换为10.0.0001您是否听说过实例方法Insert
,如s.Insert(i,“.”
?@JeppeStigNielsen非常感谢。你让我学到了新东西。看我的回答我不常让人失望,但如果这两倍还没有很快消失,恐怕我不得不这么做。不知道你为什么要投反对票(第二次编辑时被允许输入错误)。。。他将12345存储为十进制,并希望字符串格式的版本表示不同的数字!在这种情况下,值是定点的。我还没有。现在就可以了。他用的是十进制,你用的是双精度。更糟糕的是,他几乎肯定会使用十进制,甚至整数来避免浮点固有的错误。这会否定我的观点吗?他的十进制数存储一个值,而字符串表示形式是完全不同的值?我将修改为十进制,但我仍然认为我的观点是正确的。很抱歉,我的“不知道你为什么投反对票”是为了另一票。您在我回复之前发表了评论:(我编辑过的答案现在更好了吗?我为你的努力喝彩,先生。如果没有其他证据的话,你已经证明不除以100000并使用ToString()是疯狂的。耶!这就是我想要的。
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, ".");
}
}