2011-09-17 16 views

Respuesta

10

Si un número se convierte en un número entero cuando lo racionaliza, utilice el número entero; de lo contrario, quédate con el número original. Esto se logra mediante una función simple, f[x]:

f[x_] := If[IntegerQ[n = Rationalize[x]], n, x] 

Probando ...

f[67.5] 
f[0.] 
f[45.] 

(* Out *) 
67.5 
0 
45 

se puede simplemente Rationalize todos los valores, como el siguiente: deja claro

rationalize

Para ver cómo funciona en su caso, simplemente inserte (f/@) en su código para reformatear los valores de salida de Range:

[email protected][ 
Text[Style[ 
    ToString[(f/@ Range[0, 180, 22.5])[[#]]] <> "\[Degree]", 
    Bold, 16, GrayLevel[(8 - #)/10]]] & /@ Range[8], 2, 1] 

Así

temps

+0

Gracias, combinando con gaseosas, creo que N @ Rationalize @ any number debería hacerlo? – 500

+4

@ 500 N @ Rationalize @ no lo resuelve del todo, porque 'N' deshace los resultados al convertir el entero (devuelto por' Rationalize') a un número real. P.ej. 'N [Rationalize [45.]]' Devuelve "45." como el resultado. – DavidC

+0

¡Que tú David! – 500

5

En términos generales, debería utilizar Rationalize.

[email protected] 
Out[1] = 10 

Sin embargo, en su caso, usted debe no sólo tiene que utilizar Rationalize, y cuando no se desea operar en algunos de los elementos. Aquí hay un enfoque simple que hará lo que quieras.

list = Range[0, 180, 22.5] /. (x_ /; [email protected] == 0.) -> 
    [email protected] 
[email protected][ 
    Text[Style[ToString[list[[#]]] <> "\[Degree]", Bold, 16, 
     GrayLevel[(8 - #)/10]]] & /@ Range[8], 2, 1] 

enter image description here

El código anterior genera la misma lista que el suyo, y luego condicionalmente sustituye a aquellos elementos que tienen un FractionalPart igual a 0. (por ejemplo, 10.), con su IntegerPart (por ejemplo 10) .

+0

@ 500 Ver mi edición anterior – abcd

+1

Puede haber problemas con este enfoque, p. 'AccountingForm [ 1500000 * 0.675 /. (x_ /; FractionalPart @ x == 0.) -> IntegerPart @ x] ' –

+0

@ChrisDegnen Tienes razón. No pensé en los casos donde fallaría, y solo probé el caso del OP. Gracias por señalarlo :) – abcd

6

Otra posibilidad es no generarlos en primer lugar.

If[IntegerQ[#], #, [email protected]#] & /@ Range[0, 180, 45/2] 

dando

{0, 22,5, 45, 67,5, 90, 112.5, 135, 157.5, 180}

4

Otra opción es eliminar cualquier arrastrando "." usando StringTrim:

[email protected][ 
    Text[Style[ 
     StringTrim[ToString[Range[0, 180, 22.5][[#]]], "."] <> "\[Degree]", 
    Bold, 16, GrayLevel[(8 - #)/10]]] & /@ Range[8], 2, 1] 
9

Aunque la pregunta original no tiene ningún números con exponentes, sería más seguro en general a utilizar NumberForm de la siguiente manera:

trimPoint[n_] := 
NumberForm[n, 
NumberFormat -> ([email protected] 
    RowBox[Join[{StringTrim[#1, RegularExpression["\\.$"]]}, 
    If[#3 != "", { 
     "\[Times]", SuperscriptBox[#2, #3]}, {}]] 
    ] &)] 

Entonces sólo tiene que modificar el código original mediante la inserción // punto de ajuste de la siguiente manera:

[email protected][ 
Text[Style[ 
    ToString[Range[0, 180, 22.5][[#]] // trimPoint] <> "\[Degree]", 
    Bold, 16, GrayLevel[(8 - #)/10]]] & /@ Range[8], 2, 1]