Força a caixa de texto do ASP.NET a exibir a moeda com o sinal $

Existe uma maneira de obter uma caixa de texto ASP.NET para aceitar apenas valores de moeda e, quando o controle é validado, inserir um sinal de $ antecipadamente?

Exemplos:

10.23 torna-se $ 10.23
$ 1,45 permanece $ 1,45
10.a gera erro devido a não ser um número válido

Eu tenho um RegularExpressionValidator que está verificando o número é válido, mas eu não sei como forçar o sinal $ no texto. Eu suspeito que o JavaScript pode funcionar, mas queria saber se havia outra maneira de fazer isso.

3
Acabei descobrindo algum JavaScript para fazer o que eu queria. Necessário para simplificar um pacote de implantação e o kit de ferramentas AJAX era apenas outra dependência.
adicionado o autor Jason Z, fonte

5 Respostas

O controle MaskedEdit do ASP.NET é controlado pelo O AJAX Control Toolkit pode realizar o que você está pedindo.

9
adicionado
Link MaskedEdit está quebrado.
adicionado o autor Neil Knight, fonte
Qual voto baixo?
adicionado o autor Neil Knight, fonte
@ NeilKnight - Um downvote para um link quebrado de quase 5 anos de idade? Isso é duro, você não acha? Os links estão corrigidos agora, mas você (alguém que está na comunidade há mais de três anos) poderia ter ajudado a consertar um link quebrado.
adicionado o autor Forgotten Semicolon, fonte

Eu sei que uma resposta já foi aceita, mas eu queria descartar outra solução para qualquer pessoa com o mesmo problema e procurando várias soluções alternativas.

A maneira como faço isso é usar o jQuery formatar o plugin de moeda para vincular a entrada do usuário em o lado do cliente. Analisar essa entrada no lado do servidor requer apenas:

// directive
using System.Globalization;

// code
decimal input = -1;
if (decimal.TryParse(txtUserInput.Text, NumberStyles.Currency, 
    CultureInfo.InvariantCulture, out input))
{
    parameter = input.ToString();
}

A única desvantagem disso é que o usuário pode ter o JavaScript desativado e, nesse caso, o validador RegEx em execução no servidor funcionaria como um fall-back. Se o controle tiver o databound, tudo o que você precisa fazer é decimalValue.ToString ("{0: c}") , como mencionado por outros, para exibir a formatação correta da moeda.

O legal disso é que, se o usuário inserir a caixa de texto e mostrar $ 0.00 no lado do cliente, a instrução if do lado do servidor retornará false. Se o seu valor decimal não for anulável no banco de dados, apenas mude entrada decimal = -1 para entrada decimal = 0 e você terá um valor padrão de 0.

5
adicionado
Coisa certa! É muito útil.
adicionado o autor Jim Schubert, fonte

Outra maneira de fazer isso pode ser colocar o sinal de dólar fora à esquerda da caixa de texto. Existe uma necessidade real de ter o cifrão dentro da caixa ou será que um simples rótulo fará?

4
adicionado
Não há necessidade real para isso, estou unfortnately ligado aos requisitos de vendas e marketing. Eu tentei argumentar contra isso, mas fui rejeitado.
adicionado o autor Jason Z, fonte
Uma boa solução que está pensando fora da caixa! Eu não pude resistir ...
adicionado o autor Brian Hinchey, fonte
decimal sValue = decimal.Parse(txtboxValue.Text.Trim());
// Put Code to check whether the $ sign already exist or not.
//Try making a function returning boolean
//if Dollar sign not available do this
{ string LableText = string.Format("{0:c}", sValue); }
else
{ string LableText = Convert.ToString(sValue); }
2
adicionado
string.Format ("{0: c}", sValue) é uma boa solução quando você precisa colocar o valor em um rótulo às vezes e uma caixa de texto em outros momentos.
adicionado o autor Tony L., fonte

No .CS você poderia fazer uma correspondência de padrão ao longo das linhas de,

string value = text_box_to_validate.Text;

string myPattern = @"^\$(\d{1,3},?(\d{3},?)*\d{3}(\.\d{0,2})|\d{1,3}(\.\d{2})|\.\d{2})$";
Regex r = new Regex(myPattern);
Match m = r.Match(value);

if (m.Success)
{
    //do something -- everything passed
}
else
{
    //did not match
    //could check if number is good, but is just missing $ in front
}
0
adicionado
Já está executando esse regex. Eu quero que o sinal $ seja inserido no valor da caixa de texto depois que o valor for inserido, de preferência sem um postback.
adicionado o autor Jason Z, fonte