Как отформатировать ввод пользователя в правильный локализованный формат? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть <input type="text"/>, где пользователь может (попытаться) ввести дату в любом формате / синтаксисе (даже в неверном формате).

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

Я пытаюсь следовать этим рекомендациям, чтобы использовать локальный момент

// I want to use a local instance of moment
let localLocale = moment();

// I want to set the locale to be 'fr'
localLocale.locale('fr')

// I want to set the format to be 'LL'
localLocale.format('LL')

// this is what the user typed in
let userInput = '2/3/1986'

// I want to do:
let formattedUserInput = something(userInput)

Значение formattedUserInput должно быть Mars 2, 1986

Я ищу, каким должно быть something.В тот момент, когда документы настолько запутаны, нет объяснения, как это сделать.

Если userInput, очевидно, является бредом, something() должен вернуть ноль или выдать ошибку или что-то, что я не возражаю.

Я пытался localLocale(userInput), но выдает localLocale is not a function

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы можете использовать moment(String, String[]) для анализа входных данных в различных форматах:

Если вы не знаете точный формат входной строки, но знаете, что это может бытьодин из многих, вы можете использовать массив форматов.

Вы можете использовать moment.ISO_8601, как показано здесь , чтобы проанализировать входы ISO 8601 какmoment(String) делает.

Обратите внимание, что moment(String, String[])

Начиная с версии 2.3.0 Момент использует несколько простых эвристик, чтобы определить, какой формат использовать.По порядку:

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

Одним из возможных решений может быть следующее:

function something(userInput){
  let m = moment(userInput, [moment.ISO_8601, 'DD/MM/YYYY', 'MM/DD/YYYY' ]);
  if( !m.isValid() ){
    // throw "Invalid input";
  }
  return m.locale('fr').format('LL');
}

['2/3/1986', 'aaa', '10-15-2017'].forEach((userInput) => {
  console.log( something(userInput) );
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/locale/fr.js"></script>
0 голосов
/ 14 декабря 2018

Набор локалей является локальным для момента, который вы определили.Таким образом,

let localLocale = moment();
localLocale.locale('fr');

устанавливает локальное значение для localLocale в 'fr'.Поэтому, если вы хотите сделать это локально только для этого ввода, вы должны использовать:

// this is what the user typed in
let userInput = '2/3/1986';

// Use a local instance of moment, using the user's input
let localLocale = moment(userInput, 'D/M/YYYY');

// Set the locale to be 'fr'
localLocale.locale('fr');

// Get the formatted string
let formattedUserInput = localLocale.format('LL');

console.log(formattedUserInput);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment-with-locales.min.js" integrity="sha256-VrmtNHAdGzjNsUNtWYG55xxE9xDTz4gF63x/prKXKH0=" crossorigin="anonymous"></script>
...