Хобрук: Ваш путь к мастерству в программировании

Как я могу отформатировать строковые значения с помощью маски в общем виде?

Справочная информация: у нас есть система, которая получает данные из другой серверной системы. Мы обрабатываем отображение этих данных, и у нас есть собственные XML-шаблоны для управления отображением определенных вещей (т. е. у нас есть собственные шаблоны столбцов, определяющие заголовки столбцов и т. д.). Одна вещь, которую мы хотели бы поддерживать, — это возможность предоставить маску для этих шаблонов столбцов, которая будет применяться к значениям, поступающим из бэкэнда. Ниже приведен сценарий, с которым у меня возникли проблемы.

Проблема: я не могу заставить работать простой строковый формат. Я хотел бы отформатировать значение STRING из четырех цифр (например, «1444») в формате времени (например, «14:44»). Я пробовал:

String.Format("{0:00:00}", "1444")

Обратите внимание на важность ввода STRING. Если я укажу значение int, формат будет работать. Причина, по которой я не могу использовать это, заключается в том, что все данные, которые мы получаем от серверной части, имеют строковый формат, и мы хотели бы, чтобы они были универсальными (поэтому кастинг на самом деле не вариант).

Под общим я подразумеваю, что я хотел бы указать маску в наших собственных шаблонах XML, например:

<MyColumnTemplate Id="MyColumn" Mask="00:00" />

и использовать эту маску в вызове строкового формата для строковых значений? Если маска не работает, мы можем просто вернуть исходное значение (как уже делает метод String.Format() по умолчанию).

Изменить. Чтобы уточнить, вот упрощенная версия того, что я хотел бы сделать в коде:

string inputValue = "1444";
string maskValueFromXml = "00:00";

string mask = "{0:" + maskValueFromXml + "}";
string myDesiredEndResult = String.Format(mask, inputValue);

  • Я думаю, вам нужно написать свой собственный FormatProvider. 29.10.2013

Ответы:


1

Дело в том, что вы работаете от строки к строке, так как вы запрашиваете время и номер телефона, все они являются числами, тогда попробуйте этот трюк (если мы можем назвать это так :)):

string result = string.Format("{0:00:00}", int.Parse("1444"));

Для номера телефона:

string result = string.Format("{0:000-000-0000}", int.Parse("1234560789"));

Вы даже можете поместить желаемые маски, например, в словарь и сделать это:

Dictionary<string, string> masks = new Dictionary<string, string>();
masks.Add("Phone", "{0:000-000-0000}");
masks.Add("Time", "{0:00:00}");
string test = "1234560789";
string result = string.Format(masks["Phone"], int.Parse(test));
29.10.2013
  • int.parse анализирует начальный ноль в строке? Итак, 01234 создает следующий int 01234? 31.01.2017

  • 2

    Попробуйте с DateTime.TryParseExact, например:

        DateTime dateEntered;
        string input = "1444";
    
        if (DateTime.TryParseExact(input, "HH:mm", System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out dateEntered))
        {
            MessageBox.Show(dateEntered.ToString());
        }
        else
        {
            MessageBox.Show("You need to enter valid 24hr time");
        }
    

    После этого вы можете использовать предопределенные форматы string.Format на MSDN.

    29.10.2013
  • Спасибо за ответ, но, возможно, я недостаточно ясно выразился. Хотя это действительно может работать для значений времени, меня больше беспокоит универсальность. Что, если значение, которое мы хотели замаскировать, было номером телефона? А наша маска была что-то вроде 000-000-0000? Мой вопрос был более или менее таким: есть ли способ, с помощью которого мы можем избежать пользовательской логики для каждого сценария и просто выполнить базовую логику маскирования, используя функциональность String.Format(), предоставив маску и строковое значение? 29.10.2013
  • Предположим, что вы знаете, какие данные в настоящее время читает ваше приложение, у вас есть несколько вариантов. Либо используйте метод, подобный terrybozzio, либо создайте фабрику преобразователей для возможных типов, а затем вы можете использовать общий метод. 30.10.2013
  • Новые материалы

    Управление DOM для чайников вроде меня
    Одной из первых вещей, которую мы рассмотрели, когда начали изучать Javascript во Flatiron, была модель DOM. Кто он? Чем он занимается? Он больше машина, чем человек? Ну да довольно много. ДОМ..

    Что такое структура данных?
    Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

    Искусственный интеллект в юридической отрасли - пример прогнозирования судебных решений с помощью глубокого обучения
    На протяжении всей истории люди полагались на суды, присяжных, королей и королев в отправлении правосудия. Сегодня способность судов обеспечивать справедливое и быстрое правосудие для своих..

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..