Форматирование строки - PullRequest
       31

Форматирование строки

0 голосов
/ 06 января 2012

Я могу написать приложение, которое преобразует строки (из чисел) длиной от 8 до 12 символов (см. Примеры ниже)

  • 1404336133
  • 4174728823
  • 0587035281

По сути, я хочу преобразовать приведенные выше строки в определенный формат (сохраненный в файле конфигурации), как показано ниже.

<add key="Consumer_Code_Format_For_Code_Length_Eight" value="#### ####"/>
<add key="Consumer_Code_Format_For_Code_Length_Nine" value="### ### ###"/>
<add key="Consumer_Code_Format_For_Code_Length_Ten" value="### #### ###"/>
<add key="Consumer_Code_Format_For_Code_Length_Eleven" value="#### ### ###"/>
<add key="Consumer_Code_Format_For_Code_Length_Twelve" value="#### #### ####"/>

Яв настоящее время для форматирования кодов используется следующий код ...

public static string FormatCode(string code)
{
    switch (code.Length.ToString())
    {
        case "8":
            string codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Eight"];
            code = String.Format("{0:" + codeFormat + "}", Double.Parse(code));
            break;

        case "9":
            codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Nine"];
            code = String.Format("{0:" + codeFormat + "}", Double.Parse(code));
            break;

        case "10":
            codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Ten"];
            code = String.Format("{0:" + codeFormat + "}", Double.Parse(code));
            break;

        case "11":
            codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Eleven"];
            code = String.Format("{0:" + codeFormat + "}", Double.Parse(code));
            break;

        case "12":
            codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Twelve"];
            code = String.Format("{0:" + codeFormat + "}", Double.Parse(code));
            break;

        default:
            codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Eight"];
            code = String.Format("{0:" + codeFormat + "}", Double.Parse(code));
            break;
    }

    // Finally return the newly formatted code
    return code;
}

Однако для кода 0587035281 отображается «58 7035 281», поэтому удаляется начальный ноль, который мне требуется.

Любойидеи, как это остановить, а также что-то не так или подозрительно с моим кодом?

С нетерпением ждем вашего ответа

Ответы [ 3 ]

1 голос
/ 06 января 2012
public static string FormatCode(string code)
{
    switch (code.Length.ToString())
    {
        case "8":
            string codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Eight"];
            break;

        case "9":
            codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Nine"];
            break;

        case "10":
            codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Ten"];
            break;

        case "11":
            codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Eleven"];
            break;

        case "12":
            codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Twelve"];
            break;

        default:
            codeFormat = ConfigurationManager.AppSettings["Consumer_Code_Format_For_Code_Length_Eight"];
            break;
    }

    char[] result = new char[codeformat.Length];

    int used = 0;
    for(i = 0; i < codeformat.Length; i++)
    {
        if (codeformat[i] == '#')
        {
            result[i] = code[used];
            used++;
        }
        else
            result[i] = codeformat[i];
    }
    // Finally return the newly formatted code
    return new string(result);
}
0 голосов
/ 06 января 2012

Нет встроенного решения, которое вы можете сделать встроенным, вам придется выполнять свою собственную обработку. Поскольку на самом деле это не число, с которым вы имеете дело, и, возможно, вам могут понадобиться какие-то нечисловые литералы, лучше всего вставлять пробел через каждые N символов. Это будет примерно так:

int chunkSize = 3;
string a = "0123456789";
int len = a.Length;
StringBuilder sb = new StringBuilder(len + len / chunkSize);
int firstIdx = len % chunkSize;
sb.Append(a.Substring(0, firstIdx));
sb.Append(" ");
for (int i = firstIdx; i < len; i += chunkSize)
{
    sb.Append(a.Substring(i, chunkSize));
    sb.Append(" ");
}
a = sb.ToString();
0 голосов
/ 06 января 2012

Double значения на самом деле сохраняются в виде чисел, поэтому ведущие нули автоматически удаляются при использовании Double.Parse().

Чтобы добавить начальные нули еще раз, вы можете сделать что-то похожее на это (не проверялось), написано от макушки головы.) Запомните исходную длину, затем сравните результат и добавьте столько начальных нулей, сколько требуется.

public static string FormatCode(string code)
{
    int originalLength = code.Length;

    switch (originalLength)
    {
        case 8:
            string codeFormat = ...;
            code = ...;
            break;
        case 9:
            codeFormat = ...;
            code = ...;
            break;
        // ...

    while (code.Length < originalLength) {
        code = "0" + code;
    }

    return code;
}
...