Разбить строку, содержащую 16 цифр, на 4 группы - PullRequest
3 голосов
/ 13 апреля 2011

Если вы посмотрите на пластик в вашем кошельке, 16-значный номер кредитной карты будет разбит на 4 группы по 4. Я пытаюсь сделать то же самое,

В настоящее время у меня есть строка, которая имеет 16 цифр, но сформирована как 1 одно число. Как я могу добавить "" после 4-го 8-го и 12-го числа?

Любые советы будут очень полезны.

Спасибо

Ответы [ 6 ]

5 голосов
/ 13 апреля 2011
var number = 1234567890123456;
number.ToString( "0000-0000-0000-0000" );
1 голос
/ 13 апреля 2011
string number = "1234567890ABCDEF";
int counter = 0;
var result = number
    .GroupBy(_ => counter++ / 4)
    .Select(g => new String(g.ToArray()));
1 голос
/ 13 апреля 2011

Попробуйте что-то похожее на этот ответ , используя NumberFormatInfo:

NumberFormatInfo format = new NumberFormatInfo();
format.NumberGroupSeparator = " ";
format.NumberGroupSizes = new[] { 4 };
format.NumberDecimalDigits = 0;

Используйте как:

long number = 7314787188619939;
string formatted = number.ToString("n", format);
Console.WriteLine(formatted);

Если вы имеете дело со строкой, вы можете использовать регулярное выражение для быстрой манипуляции строкой.Это будет легко адаптировать к другим персонажам:

string str = "7314787188619939";
str = Regex.Replace(str, "(?!^).{4}", " $0" ,RegexOptions.RightToLeft);
0 голосов
/ 11 августа 2015

Или, если вы работаете с хэшами MD5, вы можете использовать такую ​​реализацию ...

       public string exHashMd5(string data)
    {

            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(data));
            byte[] result = md5.Hash;
            StringBuilder str = new StringBuilder();
            for (int i = 0; i < result.Length; i++)
            {
                str.Append(result[i].ToString("X2"));
            }

 /// The implementation like so. (Below) 

            NumberFormatInfo format = new NumberFormatInfo();
            format.NumberGroupSeparator = " ";
            format.NumberGroupSizes = new[] { 8 };
            format.NumberDecimalDigits = 0;
            string rstr = str.ToString();
            rstr = Regex.Replace(rstr, "(?!^).{8}", " $0", RegexOptions.RightToLeft);
            return rstr.ToString();

 /// At the end you get yourself a nice 4 way split.
 /// Test it out. have a go with chucking it into a 
 /// MessageBox.Show(exHashMd5("yourstring"));

    }

 /// Could even go one further and add
     string hashtext;
     string newline = Enviroment.Newline;
     hashtext = exHashMd5("yourtext");
/// Then you do a simple command.
    MessageBox.Show(hashtext + newline + hashtext); 
/// Nice four way again. complex but yet made simple.

Чтобы понять, что вам нужно, используйте математику. серьезно, это математическое. разделите количество символов, пока не сможете получить сумму, равную четырем. например, 32/8 = 4. тогда это даст вам четырехстороннее разделение, которое вам нужно. основные математические основной. основной. основной.

0 голосов
/ 13 апреля 2011

Вы можете попробовать что-то вроде этого, метод расширения

    public static IEnumerable<String> SplitToParts(this String forSplit, Int32 splitLength) 
    {   
        for (var i = 0; i < forSplit.Length; i += splitLength)
          yield return forSplit.Substring(i, Math.Min(splitLength, forSplit.Length - i));
    }
string s ="1234123412341234";

s.SplitToParts (4) должен добиться цели

Надеюсь, это работает!

0 голосов
/ 13 апреля 2011

Есть много ответов. Учитывая строку s=1234567890123456, проще всего создать StringBuilder и добавить его. Пример непроверенного кода ниже.

StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.Length; i += 4)
{
      sb.append(s.Substring(i, 4)); // Append these 4
      if (i != s.Length - 4)
          sb.append(" "); // append a space for all but the last group
}
Console.WriteLine(sb.ToString());
...