Eu gostaria de verificar se um objeto é um número para que .ToString()
resultaria em uma string contendo dígitos e +
, -
,.
É possível digitando simplesmente em .net (como:) if (p is Number)
?
Ou devo converter em string e depois tentar analisar em double?
Atualização: Para esclarecer, meu objeto é int, uint, float, double e assim por diante, não é uma string. Estou tentando fazer uma função que serializaria qualquer objeto em xml como este:
<string>content</string>
ou
<numeric>123.3</numeric>
ou gerar uma exceção.
c#
.net
serialization
xml-serialization
Piotr Czapla
fonte
fonte
Respostas:
Você simplesmente precisará fazer uma verificação de tipo para cada um dos tipos numéricos básicos.
Aqui está um método de extensão que deve fazer o trabalho:
Isso deve abranger todos os tipos numéricos.
Atualizar
Parece que você realmente deseja analisar o número de uma string durante a desserialização. Nesse caso, provavelmente seria melhor usar
double.TryParse
.Claro, isso não lidaria com inteiros muito grandes / decimais longos, mas se for esse o caso, você só precisa adicionar chamadas para
long.TryParse
/decimal.TryParse
/ qualquer outra coisa.fonte
Retirado do Blog de Scott Hanselman :
fonte
double.Parse(double.MaxValue.ToString())
causa umOverflowException
. Você poderia remediar isso fornecendo o modificador de ida e volta.ToString("R")
neste caso, mas essa sobrecarga não está disponível porqueConvert.ToString(...)
não sabemos o tipo. Eu sei que este é um caso um pouco marginal, mas tropecei nele enquanto escrevia testes para minha própria.IsNumeric()
extensão. Minha "solução" foi adicionar um swtich de verificação de tipo antes de tentar analisar qualquer coisa, veja minha resposta a esta pergunta para o código.Aproveite a propriedade IsPrimitive para fazer um método de extensão útil:
EDIT: Corrigido de acordo com comentários. Os genéricos foram removidos desde as caixas .GetType () tipos de valor. Também inclui correção para valores anuláveis.
fonte
object
estring
não são tipos primitivos.Existem algumas ótimas respostas acima. Aqui está uma solução tudo-em-um. Três sobrecargas para diferentes circunstâncias.
fonte
Em vez de lançar o seu próprio, a maneira mais confiável de saber se um tipo embutido é numérico é provavelmente referenciar
Microsoft.VisualBasic
e chamarInformation.IsNumeric(object value)
. A implementação lida com vários casos sutis, comochar[]
strings HEX e OCT.fonte
Existem três conceitos diferentes lá:
is
- por exemploif(obj is int) {...}
TryParse()
ToString()
pode fornecer algo que se pareça com um número, ligueToString()
e trate-o como uma stringNos dois primeiros casos, você provavelmente terá que lidar separadamente com cada tipo numérico que deseja oferecer suporte (
double
/decimal
/int
) - cada um tem diferentes intervalos e precisão, por exemplo.Você também pode consultar o regex para uma verificação geral rápida.
fonte
Supondo que sua entrada seja uma string ...
Existem 2 maneiras:
use Double.ExperimenteParse ()
usar Regex
fonte
Você pode usar um código como este:
Se o objeto é um
Int32
,Single
,Double
etc, irá efectuar a conversão. Além disso, uma string implementa,IConvertible
mas se a string não for conversível em um duplo, umFormatException
será lançado.fonte
Se sua exigência é realmente
e você deseja usar double.ExperimenteParse, então você precisa usar a sobrecarga que leva um parâmetro NumberStyles e certifique-se de que está usando a cultura invariável.
Por exemplo, para um número que pode ter um sinal à esquerda, nenhum espaço em branco à esquerda ou à direita, nenhum separador de milhar e um separador decimal de ponto, use:
fonte
Ao escrever meu próprio
object.IsNumeric()
método de extensão com base na resposta de Saul Dolgin a esta pergunta, encontrei um problema potencial em que você obterá umOverflowException
se tentar comdouble.MaxValue
oudouble.MinValue
.Minha "solução" foi combinar a resposta aceita de noldorin com a de Saul Dolgin e adicionar uma chave de correspondência de padrões antes de tentar analisar qualquer coisa (e usar alguns recursos do C # 7 para arrumar um pouco):
fonte
Sim, isso funciona:
Para um número de ponto flutuante, você teria que testar usando o tipo flutuante:
fonte