Как сравнить зависящие от локали числа с плавающей запятой?

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

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

РЕДАКТИРОВАТЬ: Позвольте мне немного пояснить:

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


person gizmo    schedule 10.02.2009    source источник


Ответы (5)


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

person AnthonyWJones    schedule 10.02.2009
comment
Ну, CDbl не работает нормально. Если, например, вы попытаетесь преобразовать 3,5, используя неправильную локаль, результатом будет не 3, а 35, что делает сравнение невозможным. - person gizmo; 10.02.2009
comment
@gizmo: вы делаете это на стороне клиента или на стороне сервера? Я не понимаю, почему неправильная локаль будет использоваться на стороне клиента. - person AnthonyWJones; 10.02.2009
comment
Потому что, например, не потому, что вы француз и пишете свою десятичную дробь через запятую, локаль вашего компьютера хорошо настроена. Мы должны проверить, имеет ли смысл десятичное число, какой бы ни была локаль системы. Я знаю, что это не сработает, если будет 3 десятичных знака, но это другая проблема. - person gizmo; 10.02.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
person KooiInc    schedule 10.02.2009

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

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

person mbillard    schedule 10.02.2009

Я использовал ответ 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);
}
person nyxz    schedule 30.11.2012

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

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

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

"I don't understand what you mean by "**,**,**".  
Please format numbers like "3123.56."
person klew    schedule 10.02.2009