Форматирование строки в MVC/С#

У меня есть строка 731478718861993983, и я хочу получить это 73-1478-7188-6199-3983 с помощью С#. Как я могу отформатировать его следующим образом?

Спасибо.

Ответы

Ответ 1

Если вы имеете дело с номером long, вы можете использовать NumberFormatInfo для его форматирования:

Сначала определите свой NumberFormatInfo (вам могут понадобиться дополнительные параметры, это основные 3):

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

Затем вы можете использовать его на своих номерах:

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

В конце концов,.Net имеет очень хорошую поддержку глобализации - вам лучше использовать ее!

Ответ 2

С помощью regex:

    public static string FormatTest1(string num)
    {
        string formatPattern = @"(\d{2})(\d{4})(\d{4})(\d{4})(\d{4})";
        return Regex.Replace(num, formatPattern, "$1-$2-$3-$4-$5");
    }

    // test
    string test = FormatTest1("731478718861993983");
    // test result: 73-1478-7188-6199-3983

Ответ 3

string s = "731478718861993983"
var newString = (string.Format("{0:##-####-####-####-####}", Convert.ToInt64(s));

Ответ 4

Только однострочный LINQ:

var str = "731478718861993983";
var result = 
    new string(
        str.ToCharArray().
            Reverse(). // So that it will go over string right-to-left
            Select((c, i) => new { @char = c, group = i / 4}). // Keep group number
            Reverse(). // Restore original order
            GroupBy(t => t.group). // Now do the actual grouping
            Aggregate("", (s, grouping) => "-" + new string(
                grouping.
                    Select(gr => [email protected]).
                    ToArray())).
            ToArray()).
    Trim('-');

Это может обрабатывать строки произвольных lenghs.

Ответ 5

Простой (и наивный) метод расширения:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("731478718861993983".InsertChar("-", 4));
    }
}

static class Ext
{
    public static string InsertChar(this string str, string c, int i)
    {
        for (int j = str.Length - i; j >= 0; j -= i)
        {
            str = str.Insert(j, c);
        }

        return str;
    }
}

Ответ 6

Если вы имеете дело строго со строкой, вы можете сделать простое Regex.Replace, чтобы записать каждую группу из 4 цифр:

string str = "731478718861993983";
str = Regex.Replace(str, "(?!^).{4}", "-$0" ,RegexOptions.RightToLeft);
Console.WriteLine(str);

Обратите внимание на использование RegexOptions.RightToLeft, чтобы начать запись справа (так что "12345" будет заменено на 1-2345, и не -12345) и использование (?!^), чтобы избежать добавления тире в начале.
Вы можете захотеть записать только цифры - возможный шаблон может быть @"\B\d{4}".

Ответ 7

string myString = 731478718861993983;
myString.Insert(2,"-");
myString.Insert(7,"-");
myString.Insert(13,"-");
myString.Insert(18,"-");

Ответ 8

Моя первая мысль:

String s = "731478718861993983";
s = s.Insert(3,"-");
s = s.Insert(8,"-");
s = s.Insert(13,"-");
s = s.Insert(18,"-");

(не помните, если индекс основан на нуле, в этом случае вы должны использовать мои значения -1) но, вероятно, есть несколько более простой способ сделать это...

Ответ 9

Вот как я это сделаю; он будет работать, только если вы храните цифры как нечто, что не является строкой, поскольку они не могут использоваться с строками формата.

string numbers = "731478718861993983";
string formattedNumbers = String.Format("{0:##-####-####-####-####}", long.Parse(numbers));

Изменить: измененный код, так как вы сказали, что они были проведены как строка в вашем исходном вопросе

Ответ 10

Если позиция "-" всегда одна и та же, вы можете попробовать

string s = "731478718861993983";
s = s.Insert(2, "-");
s = s.Insert(7, "-");
s = s.Insert(12, "-");
s = s.Insert(17, "-");