长变量中的C#替换
本文关键字:替换 变量 | 更新日期: 2023-09-27 18:21:14
我有一个很大的数字,比如:
1012223457
我需要将这个数字中的第三个最高有效数字设置为3
。我怎样才能做到这一点?有没有什么方法可以做到这一点,而不转换为字符串,也不添加"20000000"?
这不是实现您所要求的OP的最佳方式,您必须使用ToString来获得最佳和最可靠的解决方案,但尽管如此,这里有一个示例可以满足您的要求:
var a = 10000000L;
var pows = Enumerable.Range(0, 16).Select(x => (long)Math.Pow(10, x));
var d = pows.First(x => a / x == 0);
var thirdDigit = (a / (d / 1000)) % 100;
a += (long)((3 - thirdDigit) * (d / 1000));
这将在没有字符串的情况下完成。大多数卷积是在不使用字符串的情况下确定数字的长度。因此,我使用了一个数学技巧:
long number = 1012223457;
number += (long)(2*Math.Pow(10.0,(double)((int)(Math.Log10(Math.Max(Math.Abs(number), 0.5)) + 1)-3)));
2*
是您想要添加的值。
这个解决方案很模糊,但应该有效。
我甚至没有想到StackOverflow中会有计算数字长度的技巧,但你可以在这里找到有关它的信息。巧合的是,提供的代码是用C#编写的。
因此,必须使用一个非常复杂的方法,而不使用字符串,但需要数学函数来进行补偿。我可能会选择使用string
的东西,因为可读性会大大提高。
看到这个答案:
如何计算一个数字的总位数?
因此,可以这样做:
int digitpos = 5;
long number = 1080511231123;
int numbertoset = 3;
int digitcount = (int)Math.Floor(Math.Log10(number) + 1);
long exp = (long)Math.Pow(10, digitcount - digitpos);
if (exp == 0) throw new ArgumentException("The number does not contain required digit.");
int targetdigit = (int)(number / exp) % 10;
int multiplier = numbertoset - targetdigit;
long result = number + multiplier * exp;
为了替换目标数字,我必须首先计算它的值。
ToString的少量使用会产生更干净的代码。请记住,我仍然使用数学函数来进行更改,不涉及字符串操作。
var number = 123456789;
var length = number.ToString().Length;
var multiplier = Math.Pow(10, length - 3):
var oldDigit = Math.Floor(number / multiplier) % 10;
var change = 3 - oldDigit;
number += change * multiplier;