Javascript - чистая введенная пользователем денежная стоимость - PullRequest
0 голосов
/ 20 февраля 2019

Как правильно очистить денежное значение, введенное пользователем?

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

Я пробовал это:

parseFloat(amount.replace(',', '.')

Это работает вследующие случаи:

1000 -> 1000
1000.1 -> 1000.1
1000,1 -> 1000.1

Однако у меня есть следующие два случая, которые в настоящее время не работают:

1,000.1 -> gives: 1.1 / should be: 1000.1
1.000,1 -> gives 1.1 / should be: 1000.1

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

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Попробуйте это.

function parse(str){
  if(str.includes('.') && str.includes(',')){
    str = str.split(/[.,]/)
    let last = str.lastIndexOf('.') || str.lastIndexOf(',');
    return parseFloat(str.slice(0,last).join('').replace(/[.,]/g,'') + '.' + str.slice(last)) 
  }
  else return str.replace(',','.');
}
console.log(parse('1.000,1'))
console.log(parse('1,000.1'))
console.log(parse('1,0000'))
0 голосов
/ 20 февраля 2019

Вот мое рабочее предложение с 10 тестами:

    const getCorrectValue = (value = 0) => {
      return (''+value)
        .replace(',','.')
        .match(/.\d*/g)
        .map((val, i, arr) => {
          return (i < arr.length - 1)
            ? val.replace(/[,|\.]/g, '')
            : val
        })
        .join('');
    }

    const testCases = [
      getCorrectValue() === "0",
      getCorrectValue(1.0) === "1",
      getCorrectValue("1") === "1",
      getCorrectValue("1,0") === "1.0",
      getCorrectValue("1.0") === "1.0",
      getCorrectValue(1.1) === "1.1",
      getCorrectValue("1,1") === "1.1",
      getCorrectValue("1.1") === "1.1",
      getCorrectValue("1,000.1") === "1000.1",
      getCorrectValue("1.000.1") === "1000.1",
      getCorrectValue("1,000.000.1") === "1000000.1",
    ];

console.log('Test pass', testCases.map((testCase, i) => (testCase) ? `${i} pass` : `${i} fails`));
0 голосов
/ 20 февраля 2019

Насколько я могу судить, код должен различать десятичный разделитель и разделитель тысяч.Может быть только один десятичный разделитель, и обычно это последний '.'или ',' на входе.Вы можете заменить только последний «,» в строке на «.»и удалите все остальные ',' и '.'от входа.Это будет работать для предоставленных вами тестовых случаев, но если пользователь введет что-то вроде 100,001, а ',' - это разделитель тысяч, код все равно не будет выполнен.На мой взгляд, лучший способ - использовать какую-либо маску ввода или параграф справки, обозначающий правильный тип входного значения.

...