2009-10-09 18 views
7

¿Hay alguna manera directa de garantizar que, cuando se convierten en cadenas, los números aproximados (es decir, los números con el encabezado Real) no tendrán un "." final? Me gustaría que tuvieran solo el punto decimal en los casos en los que realmente hay una parte fraccionaria mostrada.Suprimir un seguimiento "." en salida numérica de Mathematica

Las soluciones que he encontrado no son robustos, y dependen del uso de Precision y Accuracy juntos NumberForm de manera abrupta, o el uso de RealDigits de una manera aún más incómoda.

Gracias de antemano.

Respuesta

5

que he usado en el pasado cuando se muestran los números en cifras:

Integerise[x_] := If[Round[x] == x, ToString[[email protected]] <> ".0", [email protected]] 

Basta con retirar <> ".0" si no desea que los enteros se muestren con un decimal cero.

Actualización: Como se ha mencionado por dreeves en el comentario, ToString todavía truncar un número dentro de 0,0001 o menos de un número entero y mostrar el punto.

Una mejor manera de eliminar el punto de salida es utilizar el formato Inputform para ToString:

NormalNumber[x_] := ToString[x, InputForm] 

con una prueba:

NormalNumber /@ {5, 5.5, 123.001, 123.0001} 

Esto podría ser incorporado en Integerise anterior para solucionar el problema célebre.

+1

Acabo de probar esto y encontré que se rompe para Integerise [123.0001] (devuelve una cadena que termina con un "."). – dreeves

1

Probablemente yo solo post-procese la cadena. Es más rápido (y mucho más fácil) comprobar si el último carácter es "." que hacer aritmética redundante y tener en cuenta todas las configuraciones de precisión.

Editar: puede que usted sabe esto, pero se puede hacer algo como esto:

userToString[expr_, form___] := ToString[expr,form]; 

userToString[expr_Real, form___] := removeTrailingDot[ToString[expr,form]]; 
3

recomiendo esto:

shownum[x_] := StringReplace[[email protected][x, ExponentFunction->(Null&)], 
          RegularExpression["\\.$"]->""] 

La pena es que una búsqueda de expresiones regulares & reemplazar en el trasero "". Si quieres "123." para mostrar como "123.0" en lugar de "123", simplemente reemplaza esa cadena vacía final por ".0".

ACTUALIZACIÓN: Mi versión original se muestra incorrecta para los números que Mathematica muestra de forma predeterminada en notación científica. Lo arreglé con NumberForm.

Aquí está la versión que realmente uso en la vida real. Permite redondeo opcionales:

(* Show Number. Convert to string w/ no trailing dot. Round to the nearest r. *) 
Unprotect[Round]; Round[x_,0] := x; Protect[Round]; 
re = RegularExpression; 
shn[x_, r_:0] := StringReplace[ 
    [email protected][Round[[email protected],r], ExponentFunction->(Null&)], [email protected]"\\.$"->""] 
+0

Esto juega el rol de removeTrailingDot en mi respuesta. Además, aunque soy, por supuesto, un gran fanático de la expresión regular, es más rápido realizar manipulación directa de cadenas: comprueba el último carácter y suéltalo si es ".". La expresión regular es más rápida de personalizar, por supuesto, y tal vez la velocidad no es un problema, pero este tipo de función se puede llamar repetidamente mucho. (También podría compilar la función, no sé de antemano si eso funciona con expresiones regulares) – Cascabel

1

Las funciones NumberForm, ScientificForm, EngineeringForm, etc ... a la opción NumberFormat para formatear y organizar la mantisa, base y exponente de un número. Con

numberTrim[expr_] := NumberForm[expr, 
    NumberFormat -> (Row[{StringTrim[#1, "."], 
     If[#3 == "", "", "\[ThinSpace]\[Times]\[ThinSpace]" <> #2^#3]}] &)]; 

se reproduce la salida predeterminada de Mathematica, pero se elimina el punto final.

Cuestiones relacionadas