Estoy usando Perl para convertir algo de XML a JSON. Si el atributo XML es un número, no quiero poner comillas para que JSON lo trate como un número y no como una cadena. ¿Cómo puedo saber si una cadena Perl es un número (contiene solo números del 0 al 9 y posiblemente un punto decimal)?En Perl, ¿cómo puedo saber si una cadena es un número?
Respuesta
El JSON specification proporciona reglas bastante claras en el formato de un número, por lo que la siguiente expresión regular debería funcionar:
/^-?(0|([1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?$/
Trate Scalar::Util::looks_like_number
:
Ej:
use Scalar::Util qw(looks_like_number);
if (looks_like_number($thingy)) {
print "looks like $thingy is a number...\n"
}
creo this pregunta de perlfaq resuelve tu problema.
En general, el problema es definir qué es exactamente lo que quiere leer como número.
- ¿número válido "-1.312"?
- es "inf"?
- 5.34123412E-03?
Puede simplemente forzarlo en un número y compararlo con la cadena original.
if($value eq $value+0){
print "$value is a number\n";
}
(Nota: sólo funcionará para los números simples, como 123 o 12,3)
¿Es "0" lo mismo que "0e0" o "0.0" o "-0"? Perl normalmente piensa que sí, pero tu prueba produce el resultado opuesto. – jrockway
Podría ser más fácil para que usted acaba de leer el XML en una estructura de datos en Perl y dejar que JSON de Perl la biblioteca lo encuentra por ti. Ya lo ha comprobado, de modo que a menos que su número sea realmente una cadena en el XML (por ejemplo, tiene un espacio después, etc.) JSON->encode()
lo codificará como un número JSON.
Creo que (por experiencias recientes) está cometiendo un error al hacer cualquier tipo de conversión manual XML-> JSON. Me encontré con muchos errores en el proceso, y no menos de los cuales involucraron caracteres escapados incorrectamente.
Recomendaría analizar su XML con uno de los muchos módulos XML :: * (utilicé XML :: Simple) y luego presentarlo como JSON utilizando JSON :: XS. JSON :: XS le permite convertir una estructura de datos de Perl a JSON; XML :: Simple analiza XML a una estructura de datos Perl. Mientras tanto, puedes manipular la estructura de datos de Perl como desees.
En pocas palabras, ya no le importan los caracteres de cita/escape.
Suponiendo que no es necesario para apoyar cosas inusuales (como ciencia notación) esta casi funciona (y es muy simple):
#!/usr/bin/perl
my $foo = '1234.5';
if($foo =~ /\d+/){
print "$foo is a number\n";
}
La razón de que no es totalmente el trabajo, ya que puede tener guiones y puntos en cualquier lugar (tantos como quieras) siempre y cuando tengas al menos un dígito presente). '--1--2' se evalúa como cero y '1.2.3.4.5' evals como 1.2 (el segundo punto y todo lo demás se ignoran). Esto puede o no ser un problema para usted.
- 1. ¿Cómo puedo convertir una cadena en un número en Perl?
- 2. Lua: ¿Cómo saber si un elemento es una tabla en lugar de una cadena/número?
- 3. ¿Cómo saber si una cadena es xml?
- 4. cómo saber si una variable es una tupla, una cadena o un número entero?
- 5. ¿Cómo puedo saber si un entero Java es nulo?
- 6. ¿Cómo saber si un objeto es un número entero o una cadena o isa booleano?
- 7. Cómo determinar si una cadena es un número en C#
- 8. ¿Cómo convierto una cadena binaria en un número en Perl?
- 9. ¿Cómo saber si un hash Perl es multidimensional?
- 10. Perl, ¿cómo determinar si un valor variable es un número?
- 11. ¿Cómo extraer un número de una cadena en Perl?
- 12. cómo saber si una cadena es base64 o no
- 13. ¿Cómo puedo encapsular una cadena en Perl?
- 14. ¿Cómo puedo saber si una tabla es una matriz?
- 15. En Lua, ¿cómo puedo saber si un número se divide de manera uniforme en otro número?
- 16. ¿Cómo puedo saber si una columna es auto_increment en mysql?
- 17. ¿Cómo puedo averiguar si el primer carácter de una cadena es un número en VB.NET?
- 18. ¿Cómo puedo saber si una propiedad es una colección genérica?
- 19. ¿Cómo puedo verificar si una cadena Perl contiene letras?
- 20. ¿Cómo puedo saber si una variable de python es una cadena o una lista?
- 21. ¿Cómo puedo preasignar una cadena en Perl?
- 22. ¿Cómo puedo verificar si un número (tipo doble) almacenado como una cadena es un número doble válido en C++?
- 23. ¿Cómo puedo saber si una cadena dada es una entrada válida para preg_match de PHP?
- 24. ¿Cómo puedo saber si una impresora imprimirá en un archivo?
- 25. ¿Cómo puedo averiguar si el primer carácter de una cadena es un número?
- 26. ¿Cómo puedo saber si un archivo está en un sistema de archivos remoto con Perl?
- 27. ¿Cómo puedo saber si una mónada es conmutativa?
- 28. ¿Cómo puedo saber si un IQueryable es IQueryableQueryable?
- 29. ¿Cómo puedo saber si un MotionEvent es relativo o absoluto?
- 30. ¿Cómo puedo saber si una cadena comienza con otra cadena en Ruby?
acaba de darse cuenta de que looks_like_number devuelve verdadero para 'inf', 'nan', '1E02' y probablemente algunas cadenas más que usted puede esperar que no sean números. – mirod
¿por qué '1E02' no se espera que sea un número?es notación científica para 100. –