Как сравнить локал-зависимые числа с плавающей запятой? - PullRequest
4 голосов
/ 10 февраля 2009

Мне нужно сравнить значение с плавающей точкой, введенное в веб-форму, с диапазоном. Проблема заключается в том, что клиентские компьютеры могут иметь различные настройки локали, что означает, что пользователь может использовать либо «.» или ",", чтобы отделить целую часть от десятичной.

Есть ли простой способ сделать это? Поскольку для внутренней сети и для них разрешено использовать только IE, VBScript - это хорошо, даже если я предпочел бы использовать JavaScript.

РЕДАКТИРОВАТЬ: Позвольте мне немного уточнить это:

Я не могу полагаться на языковой стандарт системы, потому что, например, многие наши французские клиенты используют компьютер с английским языком, даже если они все еще используют запятую для заполнения данных в веб-формах.
Поэтому мне нужен способ выполнить проверку по нескольким языковым преобразованиям "строка в двойное число".
Я знаю, что условие повышения - «как насчет чисел с 3 десятичными цифрами», но в нашем окружении такого ответа никогда не будет, и если это произойдет, он будет воспринят как ошибка вне диапазона из-за умножения на тысяч, так что это не настоящая проблема для нас.

Ответы [ 5 ]

1 голос
/ 10 февраля 2009

Этот код должен работать:

  function toFloat(localFloatStr)
    var x = localFloatStr.split(/,|\./),
        x2 = x[x.length-1],
        x3 = x.join('').replace(new RegExp(x2+'$'),'.'+x2);
    return parseFloat(x3);
    //  x2 is for clarity, could be omitted:
    //=>x.join('').replace(new RegExp(x[x.length-1]+'$'),'.'+x[x.length-1])
  } 

  alert(toFloat('1,223,455.223')); //=> 1223455.223
  alert(toFloat('1.223.455,223')); //=> 1223455.223
  // your numbers ;~)
  alert(toFloat('3.123,56')); //=> 3123.56
  alert(toFloat('3,123.56')); //=> 3123.56
1 голос
/ 10 февраля 2009

В JavaScript используйте parseFloat в текстовом значении, чтобы получить число. Аналогично в VBScript используйте CDbl для текстового значения. Оба должны соответствовать текущим языковым настройкам, установленным для пользователя.

0 голосов
/ 30 ноября 2012

Я использовал ответ KooiInc, но немного изменил его, потому что он не учитывал некоторые случаи.

function toFloat(strNum) {
    var full = strNum.split(/[.,]/);

    if (full.length == 1) return parseFloat(strNum);

    var back = full[full.length - 1];
    var result = full.join('').replace(new RegExp(back + '$'), '.' + back);

    return parseFloat(result);
}
0 голосов
/ 10 февраля 2009

Запрещается использовать любой разделитель тысяч.

Дайте пользователю пример: «Реалы должны выглядеть так: 3123.56 или 3123,56». Затем просто измените , на . и проанализируйте его.

Вы всегда можете сказать пользователю, что он сделал что-то не так с таким сообщением:

"I don't understand what you mean by "**,**,**".  
Please format numbers like "3123.56."
0 голосов
/ 10 февраля 2009

Мы пытаемся выполнить синтаксический анализ с использованием культуры пользователя, а если это не сработает, проанализируйте ее с помощью инвариантной культуры.

Я не знаю точно, как это сделать в javascript или vbscript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...