【问题标题】:C# replace in long variableC# 替换长变量
【发布时间】:2014-09-10 04:41:36
【问题描述】:

我有很多像:

1012223457

我需要将此数字中的第三个最重要的数字设置为3。我怎样才能做到这一点?有没有什么方法可以在不转换为字符串且不添加“20000000”的情况下做到这一点?

【问题讨论】:

  • 不,你盖过了。为什么添加 20000000 不好?
  • 在不解释为什么不能使用 Y 或 Z 的情况下问“我需要在不使用 Y 或 Z 的情况下做 X”并没有多大意义。
  • 因为它可以是 9 个数字,而不总是 10
  • 您省略了哪些其他有趣的要求?像“仅使用 XXXXX 操作”或类似的东西?它可以是50位长吗? (或者您的意思是“长”为 C# long 也称为 System.Int64)?
  • 为什么不能转成字符串?

标签: c# long-integer


【解决方案1】:

这不是执行您所要求的 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));

【讨论】:

    【解决方案2】:

    这将在没有字符串的情况下完成。大多数卷积是在不使用字符串的情况下确定数字的长度。所以我使用了一个数学技巧:

    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 中,但您可以找到有关它的信息 here 。巧合的是,提供的代码是用 C# 编写的。

    因此,必须使用一种非常复杂的方法而不使用字符串,但需要数学函数来补偿。我可能会选择使用 string 的东西,因为可读性会大大提高。

    【讨论】:

      【解决方案3】:

      看到这个答案:

      How can I get a count of the total number of digits in a number?

      因此可以这样做:

      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;
      

      要替换目标数字,我必须先计算它的值。

      【讨论】:

        【解决方案4】:

        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;
        

        【讨论】:

        • 甚至没有看到您的代码是否有效,问题就明确指出“有没有办法在不转换为字符串的情况下做到这一点”。
        • 没错,但我的印象是 OP 的意思是“不要使用字符串来替换数字”。我会先等待OP的答复。还有@VDohnal 哦,伙计,我一定很累。
        • 您仍然通过ToString()number 转换为string 以获得长度。
        • 有趣的是,这是公认的答案,但它转换为 OP 告诉我们我们无法使用的字符串。咯咯笑
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-28
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多