【问题标题】:Given a string a numbers, format as 3 digits per chunk [duplicate]给定一个字符串一个数字,格式为每个块 3 位 [重复]
【发布时间】:2020-07-27 11:07:51
【问题描述】:

我需要创建一个接收一串数字的方法 - 例如,174709580098747434。 然后需要将其格式化为三个块并以数组的形式返回 - 例如,{174, 709, 580, 098,747,434}。

这是我目前所拥有的。我不认为这是在做正确的工作。如果我有一个非常大的数字,它也不会有用。

我对 C# 很陌生,只是一个初学者!

using System;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            string ques = "17470958834";
            Console.WriteLine(Chunk(ques));
        }
        public static string Chunk(string num)
        {
            // long inInt = Convert.ToInt64(num);
            string ans = "";
            for (int i = 0; i < num.Length; i += 3)
            {
                if (i == 2)
                {
                    ans.Insert(2, "-");
                }

                else if (i == 5)
                {
                    ans.Insert(5, "-");
                }
                else if (i == 8)
                {
                    ans.Insert(8, "-");
                }
                else if (i == 11)
                {
                    ans.Insert(11, "-");
                }
            }

            return ans;
        }
    }
}

【问题讨论】:

  • 你想得到字节而不是字符串:ulong input = 174709580098747434; byte[] 输出 = BitConverter.GetBytes(input);
  • OP:您的 if 子句永远不会实现,因为您的 for 将迭代 i 为 0, 3, 6, 9, ...
  • 如果输入字符串的长度不能被3整除,应该输出什么?
  • 输入12应该是什么结果? 1234? 12.345? -1234? 0012?
  • "我对 C# 很陌生,只是一个初学者!"如果这是真的,那么我强烈建议不要使用 Orel 发布的解决方案。你的练习是为了一个简单的目的而设计的:即强迫你经历一个“痛苦的”过程,通过问题和可能的算法来思考自己。我建议您先尝试用笔和纸解决这个问题。用人类语言写下算法,然后尝试将其翻译成代码。你已经解决了几乎所有的问题。

标签: c# string-parsing


【解决方案1】:

如果你使用 NuGet 的“System.Interactive”扩展来获取Buffer 操作符,那么你可以这样做:

var number = "174709580098747434";
var output =
    String.Join(
        " ",
        number //174709580098747434 - string
            .Reverse() //434747890085907471 - char array
            .Buffer(3) //434 747 890 085 907 471 - array of char array
            .Select(x => String.Concat(x.Reverse())) //434 747 098 580 709 174 - string array
            .Reverse()); //174 709 580 098 747 434 - string

这给了我174 709 580 098 747 434

没有Buffer你可以使用稍微丑一点的版本:

var output =
    String.Join(
        " ",
        number
            .Reverse()
            .Select((x, n) => (x, n))
            .GroupBy(z => z.n / 3)
            .Select(z => z.Select(y => y.x))
            .Select(x => String.Concat(x.Reverse()))
            .Reverse());

【讨论】:

    【解决方案2】:

    对于初学者来说应该更简单,应该发人深省。遵循以下技术:

    string value = "174709580098747434";
    int chunk = 3;
    int length = value.Length;
    for (int i = 0; i < length; i += chunk)
    {
        if (i + chunk > length) chunk = length - i;
        Console.WriteLine(value.Substring(i, chunk));
    }
    Console.ReadLine();
    

    【讨论】:

    • 您能否详细说明此解决方案的简单性和发人深省的性质?
    • 为初学者和循环构建逻辑的简单解决方案。否则,@Orel Eraki 在第一条评论中提供了很多简洁而简短的解决方案。
    【解决方案3】:

    希望下面的代码能解决你的问题。

    public static  string[] Chunk(string number)
    {
        int count = (number.Length / 3)+(number.Length % 3 > 0 ? 1 : 0);
        string[] result = new string[count];
        for (int i = 0; i < count; i++)
        {
            result[i] = number.Substring(i*3, ((i+1) * 3) < number.Length ? 3 : number.Length - (i * 3));
        }
        return result;
    }
    

    如果你愿意,你甚至可以像下面这样概括它:

    ///number is string value
    ///splitStringCount is count which you want your string to get splitted.
    private string[] Chunk(string number, int splitStringCount = 3)
        {
            int count = (number.Length / splitStringCount) +(number.Length % splitStringCount > 0 ? 1 : 0);
            string[] result = new string[count];
            for (int i = 0; i < count; i++)
            {
                result[i] = number.Substring(i* splitStringCount, ((i+1) * splitStringCount) < number.Length ? splitStringCount : number.Length - (i * splitStringCount));
            }
            return result;
        }
    

    如果您只想要返回数组中的 3 位数字,请检查以下代码:

    像下面这样调用这个方法:

    Chunk("174709580098747434");
    

    方法逻辑如下:

    public static string[] Chunk(string number, int splitStringCount = 3)
        {
            int count = (number.Length / splitStringCount);
            string[] result = new string[count];
            for (int i = 0; i < count; i++)
            {
                result[i] = number.Substring(i* splitStringCount, splitStringCount);
            }
            return result;
        }
    

    【讨论】:

    • 有人可以在这里评论下投吗?
    • "有人可以在这里评论下演员吗?"不,我没有投票,但我可以评论你的回答。它有很多(部分是神秘的)代码并且没有解释。您的回答没有解释为什么首先出现问题或 OP 发布的代码有什么问题。它既没有解释你的代码做了什么,也没有解释它实际上是如何解决 OP 的问题的。我最好的猜测是,这些是反对票的部分原因。至少对我来说是这样,但我宁愿写 cmets 而不是投反对票
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 2011-09-19
    • 1970-01-01
    • 2016-11-07
    • 2015-05-26
    • 2014-02-04
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多