Estou criando um aplicativo da Web que é principalmente para navegadores móveis. Como estou usando campos de entrada com o tipo de número, a maioria dos navegadores móveis chama apenas o teclado numérico para melhorar a experiência do usuário. Este aplicativo da Web é usado principalmente em regiões onde o separador decimal é vírgula, não ponto, por isso preciso lidar com os dois separadores decimais.
Como cobrir toda essa bagunça com ponto e vírgula?
Minhas descobertas:
Chrome para computador
- Tipo de entrada = número
- O usuário digita "4,55" no campo de entrada
$("#my_input").val();
retorna "455"- Não consigo obter o valor correto da entrada
Desktop Firefox
- Tipo de entrada = número
- O usuário digita "4,55" no campo de entrada
$("#my_input").val();
retorna "4,55"- Tudo bem, eu posso substituir vírgula por ponto e obter a flutuação correta
Navegador Android
- Tipo de entrada = número
- O usuário digita "4,55" no campo de entrada
- Quando a entrada perde o foco, o valor é truncado para "4"
- Confuso para o usuário
Windows Phone 8
- Tipo de entrada = número
- O usuário digita "4,55" no campo de entrada
$("#my_input").val();
retorna "4,55"- Tudo bem, eu posso substituir vírgula por ponto e obter a flutuação correta
Quais são as "melhores práticas" nesse tipo de situação em que o usuário pode usar vírgula ou ponto como separador decimal e eu quero manter o tipo de entrada html como número, para proporcionar uma melhor experiência ao usuário?
Posso converter vírgula em ponto "on the fly", vinculando eventos importantes, está funcionando com entradas numéricas?
EDITAR
Atualmente, eu não tenho nenhuma solução, como obter valor flutuante (como string ou número) da entrada que tipo está definido como número. Se o usuário final digitar "4,55", o Chrome sempre retornará "455", o Firefox retornará "4,55", o que é bom.
Também é bastante irritante que no Android (emulador 4.2 testado), quando eu digito "4,55" para inserir o campo e mudo o foco para outro lugar, o número digitado seja truncado para "4".
var number = $(...).get(0).valueAsNumber;
if (isNaN(number)) number = parseFloat($(...).val().replace(',', '.');
Mas essa solução só funciona se o número que tem sido posta em apenas contém uma vírgula e sem pontos extras ...
.val()
, e o Android faz algo estranho. Você pode verificar se eles se comportam da mesma maneira quando você define o idioma do sistema para algo apropriado?